第四次作业

脚本高级命令

trap:指定shell脚本要监视并拦截的Linux信号。trap命令的格式为:trap commands signals

install: 作用是安装或升级软件或备份数据,它的使用权限是所有用户。install命令和cp命令类似,都可以将文件/目录拷贝到指定的地点。但是,install允许你控制目标文件的属性。install通常用于程序的makefile,使用它来将程序拷贝到目标(安装)目录。

mktemp

expect

trap

# 查看所有trap信号
[root@localhost ~]# trap -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

# 信号操作
# 进程收到系统信号后,执行自定义指令,而不是执行原定操作
trap '自定义执行' 信号
# 忽略信号操作
trap '' 信号
# 恢复原信号操作
trap '-' 信号
# 列出自定义信号操作
trap -p
# 当脚本退出时,执行finish函数
trap finish EXIT
# 查看所有信号类型
trap -l
# 示例
[root@localhost data]# cat trap_test.sh 
#!/bin/bash

trap "echo 'now can not stop me!!'" int quit kill
echo "Staring to ping someone."
for((i=1;i<3;i++));do
   ping -c3 -w3 192.168.75.$i &> /dev/null
   sleep 1
done
trap  '-' int quit kill
echo "now you can stop/kill me!"
for((i=11;i<15;i++));do
   echo "do you want do something~~~"
   sleep 1
done
trap "" int quit kill
echo "ops,you miss the chance of stop me."
echo "now what you can only do is wait for me"
for((i=31;i<40;i++))do
   echo "haha,i am there and bite me~~~"
   sleep 0.5
done

# 执行结果
[root@localhost data]# bash trap_test.sh 
Staring to ping someone.
^Cnow can not stop me!!       //替代信号,不能退出
^Cnow can not stop me!!
^Cnow can not stop me!!
now you can stop/kill me!
do you want do something~~~    //接收信号,可以退出
do you want do something~~~
do you want do something~~~
do you want do something~~~
ops,you miss the chance of stop me.
now what you can only do is wait for me
haha,i am there and bite me~~~
haha,i am there and bite me~~~
haha,i am there and bite me~~~
haha,i am there and bite me~~~
^Chaha,i am there and bite me~~~    //忽略信号,不能退出
^Chaha,i am there and bite me~~~
^Chaha,i am there and bite me~~~
haha,i am there and bite me~~~
haha,i am there and bite me~~~

install

通过info install查看命令解析,得到如下信息:

install:拷贝文件并设置属性(包括属主和属组),和copy相比,就是可以设置属性的差异吧

使用方式有四种格式:

install [OPTION]... [-T] SOURCE DEST
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...

[root@localhost ~]# install /data/1.log /tmp/duzy/

mktemp

mktemp用于创建一个临时文件夹或者临时文件夹,此文件夹名字随机,防止冲突,虽然是临时文件夹但不会自动删除,还是需要用户手动删除

# 创建临时文件
[root@localhost ~]# mktemp /tmp/testXXXXXXXXX
/tmp/testBekKfSACR
[root@localhost ~]# ll /tmp/testBekKfSACR 
-rw------- 1 root root 0 May 19 11:18 /tmp/testBekKfSACR

# 创建临时文件夹
[root@localhost ~]# mktemp -d /tmp/backupXXXXXXXX
/tmp/backupEHYoDvnJ
[root@localhost ~]# ll -d /tmp/backupEHYoDvnJ/
drwx------ 2 root root 6 May 19 11:18 /tmp/backupEHYoDvnJ/

expect

expect是一个自动化非交互式操作命令

其子命令有:
spawn: 启动新进程
expect: 从进程接收字符串
send : 向进程发送字符串
interact : 允许用户交互
exp_continue : 继续匹配下一个字符串

示例:

# 命令行模式
## 监听到指定字符串后输出
## 注意,不管监听的字符串有多少个,只会对第一次监听到的字符串起反应,然后就退出
[root@localhost ~]# expect
expect1.1> expect "hi" { send "you said hi to me" }
123
123hi
you said hi to meexpect1.2> 
expect1.2> expect "hi" { send "said hi\n" } "no" { send "you said no\n" } "bye" { send "said bye\n" }
qwe
hi
said hi
expect1.3> expect "hi" { send "said hi\n" } "no" { send "you said no\n" } "bye" { send "said bye\n" }
oiu
on
no
you said no

## expect脚本
[root@localhost data]# cat myscp.expect 
#!/usr/bin/expect

spawn scp /tmp/mysql80-community-release-el7-1.noarch.rpm root@alonos:/tmp/   //启动一个新进程,并对这个进程进行监控
expect {                                                                      //开始监听进程
   "yes/no" { send "yes\n";exp_continue }                                     //监听"yes/no"和"password"
   "password" { send "Admin@123\n" }
}
expect eof                                                                    //脚本结束

[root@localhost data]# chmod +x myscp.expect 
[root@localhost data]# ./myscp.expect 
spawn scp /tmp/mysql80-community-release-el7-1.noarch.rpm root@alonos:/tmp/
The authenticity of host 'alonos (192.168.75.200)' can't be established.
ECDSA key fingerprint is SHA256:gTjKjSC6rFMqDvMCPIgyuQxYnHrGUmVCZ10qQmMXqak.
ECDSA key fingerprint is MD5:e6:0c:4f:50:06:96:8b:e4:04:21:48:f1:8a:ee:da:a1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'alonos,192.168.75.200' (ECDSA) to the list of known hosts.
root@alonos's password: 
mysql80-community-release-el7-1.noarch.rpm                                        100%   25KB  14.2MB/s   00:00


## 在shell脚本中调用expect
[root@rh7 data]# cat expectshell.sh 
#!/bin/bash
user=$1
password=$2
cmd1=$3

expect << EOF
set timeout 10                                   //设置超时时间
spawn ssh $user@alonos                           //开启新进程
expect {                                         //监听两个相关的关键字
   "yes/no" { send "yes\n";exp_continue}
   "password" { send "$password\n"}
}
expect "]#" { send "$3\n" }
expect "]#" { send "ls /tmp/ \n" }
expect eof
EOF

[root@rh7 data]# ./expectshell.sh root Admin@123 "ls /root"
spawn ssh root@alonos
root@alonos's password: 
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Mon May 22 13:36:01 2023 from 192.168.75.101
[root@localhost ~]# ls /root
anaconda-ks.cfg                              mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz  Python-3.7.3      schedule
initial-setup-ks.cfg                         paramiko                                    Python-3.7.3.tgz
mariadb-10.1.26-linux-systemd-x86_64         paramiko.tgz                                requests
mariadb-10.1.26-linux-systemd-x86_64.tar.gz  pymysql                                     requests.tgz
[root@localhost ~]# ls /tmp/ 
mysql80-community-release-el7-1.noarch.rpm                                    test
systemd-private-a253fa5a3a7d45db93db7a03594c1e45-bluetooth.service-Oweypd     vmware-root_885-4021784556
systemd-private-a253fa5a3a7d45db93db7a03594c1e45-chronyd.service-HnfUnv       vmware-root_916-2689078442
systemd-private-a253fa5a3a7d45db93db7a03594c1e45-ModemManager.service-dKXgqA

进程优先级命令

nice 和 renice

Priority 与 Nice 值,他们决定了进程的执行顺序,PRI值越低代表越优先的意思。不过这个PRI值是由核心动态调整的,用户无法直接调整PRI的值。既然我们用户无权干涉PRI,如果我想要调整进程的优先执行顺序时,就要透过Nice值了。PRI与NI的相关性:
PRI(new)=PRI(old) + nice

所以当nice的值为负的时候,PRI的值变小,优先级变高;nice值为正的时候,PRI的值变大,优先级变小

实例:

# 这个脚本中的循环每次会sleep 1秒
[root@rh7 data]# cat getsum.sh 
#!/bin/bash

sum=0

for((i=0;i<10;i++));do
    let sum+=i
    sleep 1
done
echo $sum

# 正常运行,降低优先级运行,提高优先级运行
[root@rh7 data]# time ./getsum.sh 
45

real	0m10.021s
user	0m0.005s
sys	0m0.007s
[root@rh7 data]# time nice -n 19 bash getsum.sh 
45

real	0m10.062s
user	0m0.006s
sys	0m0.005s
[root@rh7 data]# time nice -n -20 bash getsum.sh 
45

real	0m10.018s
user	0m0.006s
sys	0m0.004s

可以看到,正常运行时间是10.021s,降低优先级运行是10.062s,提高优先级运行是10.018s;也就是说在运行过程中,抢占cpu时,高优先级的确有更好的表现

renice

# 将循环变为30次,用于使用renice来修改优先级
[root@rh7 data]# cat getsum.sh 
#!/bin/bash

sum=0

for((i=0;i<30;i++));do
    let sum+=i
    sleep 1
done
echo $sum

# 正常运行,降低优先级运行,提高优先级运行
[root@rh7 data]# time ./getsum.sh 
435

real	0m30.050s
user	0m0.024s
sys	0m0.004s

[root@rh7 data]# time ./getsum.sh 
435

real	0m30.053s
user	0m0.023s
sys	0m0.006s
[root@localhost tmp]# renice -n 19 -p 17717

[root@rh7 data]# time ./getsum.sh 
435

real	0m30.049s
user	0m0.024s
sys	0m0.005s
[root@localhost tmp]# renice -n -20 -p 17883
可以发现,重新设置优先级后,运行时间的变化

进程管理工具

ps命令

ps命令用于显示当前进程状态以及资源使用情况,但是只是打印当前状态,并不会动态显示,如果需要动态显示建议使用top或htop

ps中的各项意思:

USER 进程所有者的用户名
PID 进程号
START 进程激活时间
%CPU 进程自最近一次刷新以来所占用的CPU时间和总时间的百分比
%MEM 进程使用内存的百分比
VSZ 进程使用的虚拟内存大小,以K为单位
RSS 驻留空间的大小。显示当前常驻内存的程序的K字节数。
TTY 进程相关的终端
STAT 进程状态,包括下面的状态:
	D 不可中断 Uninterruptible sleep (usually IO)
	R 正在运行,或在队列中的进程
	S 处于休眠状态
	T 停止或被追踪
	Z 僵尸进程
< 高优先级
N 低优先级
L 有些页被锁进内存
s 包含子进程
\+ 位于后台的进程组;
l 多线程,克隆线程
TIME 进程使用的总CPU时间
COMMAND 被执行的命令行
NI 进程的优先级值,较小的数字意味着占用较少的CPU时间
PRI 进程优先级。
PPID 父进程ID
WCHAN 进程等待的内核事件名

ps各项参数的意思:

- -a:显示所有进程,包括其他用户的进程。

- -x:显示没有控制终端的进程,也就是后台进程。

- -u:以用户为主的格式来显示进程信息,包括进程的用户、CPU 占用率等信息。

- -e:显示所有进程,同 -A 选项。

- -f:以完整的格式显示进程信息,包括进程树、参数、环境变量等信息。

- -l:以长格式显示进程信息,包括进程状态、进程 ID、父进程 ID、CPU 占用率等信息。

- -p:指定要查看的进程号,可以同时指定多个进程号。

- -N:选择不显示的进程,如 -N java 表示不显示包含 java 的进程。

- -C:选择要显示的进程,如 -C java 表示只显示包含 java 的进程。

- PID:指定要查看的进程号,可以同时指定多个进程号。

- COMMAND:指定要查看的命令名称,可以同时指定多个命令名称。

示例:

# 显示所有进程信息
[root@rh7 data]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2 125728  4248 ?        Ss   May22   0:12 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    May22   0:00 [kthreadd]
root          4  0.0  0.0      0     0 ?        S<   May22   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    May22   0:00 [ksoftirqd/0]
root          7  0.0  0.0      0     0 ?        S    May22   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    May22   0:00 [rcu_bh]

# 显示所有进程信息,并以完整格式显示
[root@rh7 data]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 May22 ?        00:00:12 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 May22 ?        00:00:00 [kthreadd]
root          4      2  0 May22 ?        00:00:00 [kworker/0:0H]
root          6      2  0 May22 ?        00:00:00 [ksoftirqd/0]
root          7      2  0 May22 ?        00:00:00 [migration/0]
root          8      2  0 May22 ?        00:00:00 [rcu_bh]
root          9      2  0 May22 ?        00:00:01 [rcu_sched]

一般来说,ps aux 和 ps -ef都可以,但是用ps aux显示的参数多一些,查询僵尸进程需要使用ps aux

# 显示指定进程号信息
[root@rh7 data]# ps -p 2356
   PID TTY          TIME CMD
  2356 ?        00:00:00 sshd

# 显示指定命令的进程信息
[root@rh7 data]# ps -C sshd 
   PID TTY          TIME CMD
  1281 ?        00:00:00 sshd
  2356 ?        00:00:00 sshd
  

pstree命令

pstree命令将进程和线程以树状形式显示出来,直观的看出进程间的父子关系

pstree参数:

- -a:显示进程的完整命令行信息。

- -h:将该进程作为根节点显示。

- -n:禁用缩进。

- -p:显示进程的进程 ID。

- -u:显示进程的拥有者。

- -Z:以 SELinux 上下文的形式显示进程

示例:

# 不带参数
[root@localhost data]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─at-spi-bus-laun─┬─dbus-daemon
        │                 └─3*[{at-spi-bus-laun}]
        ├─at-spi2-registr───2*[{at-spi2-registr}]
        
# 显示完整命令
[root@localhost data]# pstree -a
systemd --switched-root --system --deserialize 22
  ├─ModemManager
  │   └─2*[{ModemManager}]
  ├─NetworkManager --no-daemon
  │   └─2*[{NetworkManager}]
  ├─VGAuthService -s
  ├─abrt-watch-log -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
  ├─abrt-watch-log -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detected ernel BUG atlis
  ├─abrtd -d -s
  
# 显示进程ID
[root@localhost data]# pstree -p
systemd(1)─┬─ModemManager(858)─┬─{ModemManager}(879)
           │                   └─{ModemManager}(915)
           ├─NetworkManager(916)─┬─{NetworkManager}(944)
           │                     └─{NetworkManager}(953)
           ├─VGAuthService(859)
           ├─abrt-watch-log(863)
           ├─abrt-watch-log(882)
           ├─abrtd(857)
           ├─accounts-daemon(894)─┬─{accounts-daemon}(901)
           │                      └─{accounts-daemon}(921)
           ├─at-spi-bus-laun(1945)─┬─dbus-daemon(1956)
           │                       ├─{at-spi-bus-laun}(1948)
           │                       ├─{at-spi-bus-laun}(1949)
           │                       └─{at-spi-bus-laun}(1952)
           
# 指定一个进程ID为根节点的树
[root@localhost data]# pstree -p 2012
gnome-shell(2012)─┬─ibus-daemon(2096)─┬─ibus-dconf(2099)─┬─{ibus-dconf}(2103)
                  │                   │                  ├─{ibus-dconf}(2107)
                  │                   │                  └─{ibus-dconf}(2108)
                  │                   ├─ibus-engine-sim(2244)─┬─{ibus-engine-sim}(2246)
                  │                   │                       └─{ibus-engine-sim}(2247)
                  │                   ├─{ibus-daemon}(2097)
                  │                   └─{ibus-daemon}(2100)
                  ├─{gnome-shell}(2028)
                  ├─{gnome-shell}(2029)
                  ├─{gnome-shell}(2032)
                  ├─{gnome-shell}(2087)
                  ├─{gnome-shell}(2088)
                  ├─{gnome-shell}(2089)
                  ├─{gnome-shell}(2090)
                  ├─{gnome-shell}(2091)
                  └─{gnome-shell}(2092)

prtstat命令

prtstat的全称是Process Resource Tracking statistics,即进程资源跟踪统计

# 常用方式
[root@localhost data]# prtstat -r 1
         pid: 1              	                  comm: systemd
       state: S              	                  ppid: 0
        pgrp: 1              	               session: 1
      tty_nr: 0              	                 tpgid: -1
       flags: 402100         	                minflt: 18545
     cminflt: 993105         	                majflt: 55
     cmajflt: 343            	                 utime: 173
       stime: 1081           	                cutime: 304
      cstime: 868            	              priority: 20
        nice: 0              	           num_threads: 1
 itrealvalue: 0              	             starttime: 2
       vsize: 128745472      	                   rss: 1062
      rsslim: 18446744073709551615	             startcode: 93964898770944
     endcode: 93964900226530 	            startstack: 140730496294864
     kstkesp: 7FFE5F3D8EB0   	               kstkeip: 7F821140AF43
       wchan: 18446744071797591534	                 nswap: 0
      cnswap: 18446744071797591534	           exit_signal: 17
   processor: 0              	           rt_priority: 0
      policy: 0              	 delayaccr_blkio_ticks: 12
  guest_time: 0              	           cguest_time: 0
  
 -r 表示序列化输出,更容易查看
 1  表示是pid=1,即查看pid为1的进程的占用资源

pgrep命令

pgrep 命令是Linux系统中的一种进程查找命令,可以根据进程名字或者其他属性来查找进程的进程ID(PID)。pgrep 命令可以用于查找单个进程,也可以查找多个进程。

pgrep 只能查找正在运行的进程

格式如下:

pgrep [option] pattern : pattern是用来匹配进程的,符合条件的进程将会被显示出来

常用选项:

- -a:显示进程的完整命令行信息。

- -c:只显示进程的数量,不显示进程的具体信息。

- -f:显示进程的完整命令行信息,包括命令行参数。

- -l:显示进程的名字和 PID。

- -n:只显示最新的进程。

- -o:只显示最旧的进程。

- -P ppid:只查找某个父进程 ID(PPID)下的子进程。

- -s sid:只查找某个会话 ID(SID)下的进程。

- -t term:只查找某个终端(tty)下的进程。

- -u user:只查找某个用户下的进程。

示例

# 不带选项,只会显示pid
[root@localhost data]# pgrep sshd
1281
2356

# -a选项,显示进程的完整命令
[root@localhost data]# pgrep -a sshd
1281 /usr/sbin/sshd -D
2356 sshd: root@pts/0,pts/1

# -c ,count,显示进程数
[root@localhost data]# pgrep -c sshd
2

# 查看某个父进程下的子进程,不能显示线程
[root@localhost data]# pgrep -P 1
624
661
666
823
851
854
855
856
857
858
859
860
861
862
863

# 查看某个会话下的进程
[root@localhost data]# w
 10:45:34 up 21:30,  2 users,  load average: 0.00, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.75.1     Mon13   38:46   0.10s  0.10s -bash
[root@localhost data]# pgrep -t pts/0
3881
[root@localhost data]# ps aux | grep 3881
root       3881  0.0  0.1 116572  3244 pts/0    Ss+  May22   0:00 -bash

# 显示某个用户名下的进程
[root@localhost data]# pgrep -u root
1
2
4
6
7
8
9
10
11
13
14
15
16

pidof命令

pidof用于查找正在运行的进程pid,有点类似pgrep

格式:

pidof [options] name: name必须完全匹配,比如ssh不会显示sshd的pid

示例

# 显示正在运行的所有pid
## 显示sshd正在运行的所有进程的pid
[root@rh7 data]# pidof sshd
2356 1281

# 显示第一个匹配的进程pid
[root@rh7 data]# pidof -s sshd
2356

uptime命令

uptime命令显示:开始时间,运行时间,当前用户数,平均负载

平均负载表示最近 1 分钟、5 分钟、15 分钟内的系统平均负载

在 Linux 中,平均负载数是一个三元组,分别表示最近 1 分钟、5 分钟和 15 分钟内的平均负载。通常认为,如果平均负载数小于 CPU 核心数的 70%,那么系统处于正常负载状态,如果超过了 CPU 核心数的 70%,那么系统的负载就比较高,需要进行相关优化。

例如,如果系统有 4 个 CPU 核心,那么正常负载范围应该在 2.8 左右,如果平均负载数超过了 2.8,就需要进行优化和调整了。

需要注意的是,平均负载数是一个相对的概念,不同的系统负载情况和系统配置都会对平均负载数产生影响,因此需要根据具体情况进行判断。如果系统运行正常,用户体验良好,那么平均负载数略高一些也可以接受。

[root@rh7 data]# uptime | awk -F"  |up" '{printf "%-30s%30s%-30s%30s%-30s%30s%-30s%30s", $1"","start time\n",$2,"up time\n",$3,"user num\n",$4,"load avg\n"}'
 11:40:53                                        start time
 22:25,                                             up time
2 users,                                           user num
load average: 0.00, 0.01, 0.05                     load avg

mpstat命令

mpstat全称是Multi-Processor Statistics,属于sysstat包,这个包里面有许多系统监控的工具

使用方式:

mpstat [-P {cpu|ALL}] [interval [count]]

-P 指定哪个cpu或者使用ALL指定为全部cpu

interval:间隔时间,两次之间的间隔

count:采样次数,即显示几次

count和interval必须一起使用

[root@hecs-34400 ~]# yum provides mpstat
Last metadata expiration check: 2:41:10 ago on Wed 31 May 2023 08:35:53 AM CST.
sysstat-11.7.3-7.el8_7.1.x86_64 : Collection of performance monitoring tools for Linux
Repo        : @System
Matched from:
Filename    : /usr/bin/mpstat

示例:

[root@hecs-34400 ~]# mpstat -P 0 3 2         // 监控第一个cpu(从0开始),间隔三秒,显示2次
Linux 4.18.0-372.26.1.el8_6.x86_64 (hecs-34400) 	05/31/2023 	_x86_64_	(2 CPU)
**3秒,因为搜集cpu信息,这里也会使用3秒时间**
11:21:51 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:21:54 AM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
**3秒**
11:21:54 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:21:57 AM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

top命令

top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。

top的使用方式 top [-d number] | top [-bnp]

-d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。-b:以批次的方式执行top。-n:与-b配合使用,表示需要进行几次top命令的输出结果。-p:指定特定的pid进程号进行观察。

在top命令运行中也可以使用不同的按键实现不同的操作:

?:显示在top当中可以输入的命令

P:以CPU的使用资源排序显示

M:以内存的使用资源排序显示

N:以pid排序显示

T:由进程使用的时间累计排序显示

k:给某一个pid一个信号。可以用来杀死进程

r:给某个pid重新定制一个nice值(即优先级)

q:退出top(用ctrl+c也可以退出top)

示例:

# 显示两次所有进程的信息
[root@hecs-34400 ~]# top -bn 2
# 以2秒刷新的速度显示(默认是5秒)
[root@hecs-34400 ~]# top -d 2

# 监控指定pid
[root@hecs-34400 ~]# top -p 120108

htop命令

htop工具需要安装epel源

查看帮助:htop -h

示例:

# 查看指定进程
[root@hecs-34400 ~]# htop -p 120148

# 查看指定用户
[root@hecs-34400 ~]# htop -u duzy

# 指定刷新时间间隔
[root@hecs-34400 ~]# htop -d 2

# 指定排序的两种方式
1:
进入htop后,按F6建,在左侧有所有列名,按下对应列名编号再按回车即可排序
2:
[root@hecs-34400 ~]# htop -s PID

# 过滤进程
进入htop后,按下F4,再输入过滤关键字即可

# 杀掉进程
进入htop后,,先使用光标选中进程,然后按下k键,再在左侧选中需要做出的操作,9就是kill -9;

free命令

free用于显示内存的使用情况

示例:

# 默认以kb显示内存大小
[root@hecs-34400 ~]# free 
              total        used        free      shared  buff/cache   available
Mem:        3820936      328640      888924       26632     2603372     3176672
Swap:             0           0           0

第一行就是物理内存,total是总内存大小,used表示已经使用内存大小,free表示空闲内存大小,shared表示共享内存大小,buff/cache表示缓冲区大小,available表示还可以被应用程序使用的物理内存大小

# 以M为单位显示
[root@hecs-34400 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3731         322         867          26        2542        3101
Swap:             0           0           0

# 以G为单位显示
[root@hecs-34400 ~]# free -g
              total        used        free      shared  buff/cache   available
Mem:              3           0           0           0           2           3
Swap:             0           0           0

# 每个单位以合适的单位显示
[root@hecs-34400 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          3.6Gi       321Mi       867Mi        26Mi       2.5Gi       3.0Gi
Swap:            0B          0B          0B

pmap命令

pmap命令的全称是"Process Map",是一个用于显示Linux进程内存映射情况的命令。pmap命令可以列出指定进程正在使用的内存区域,包括映射文件、共享库、堆、栈等等。它可以帮助开发人员和系统管理员更好地了解各个进程之间的内存使用情况,以便进行调试和优化。该命令可以用于查看指定进程使用的内存情况,也可以用于查看系统中所有进程的内存映射情况。

# 格式:
 pmap [options] pid [...]
pid可以多个

[option]
-x, --extended
	显示扩展格式。
-d, --device
	显示设备格式。
-q, --quiet
	不显示某些页眉或页脚行。
-A, --range <low>,<high>
	将结果限制在给定范围内的低地址和高地址。
-X
	显示比 -x 选项更多的细节。 警告:根据 /proc/PID/smaps 改变格式。
-XX
	显示内核提供的所有内容。
-p, --show-path
	在映射列中显示文件的完整路径。
-c, --read-rc
	读取默认配置。
-C, --read-rc-from <file>
	从指定文件读取配置。
-n, --create-rc
	创建新的默认配置。
-N, --create-rc-to file
	创建新配置到指定文件。
-h, --help
	现实帮助信息并退出。
-V, --version
	显示版本信息并退出。

扩展格式何设备格式信息如下:
Address:  start address of map  映射起始地址。
Kbytes:  size of map in kilobytes  映射大小(KB)。
RSS:  resident set size in kilobytes  驻留集大小。
Dirty:  dirty pages (both shared and private) in kilobytes  脏页大小。
Mode:  permissions on map 映像权限: r=read, w=write, x=execute, s=shared, p=private (copy on write)。
Mapping:  file backing the map , or '[ anon ]' for allocated memory, or '[ stack ]' for the program stack. 占用内存的文件,[anon] 为已分配内存,[stack] 为程序栈。
Offset:  offset into the file 文件偏移。
Device:  device name (major:minor)  设备名。

# 查看进程使用内存情况
[root@hecs-34400 ~]# ps uax | grep tail
root      120169  0.0  0.0   7356   876 pts/1    S+   May31   0:00 tail -f d.txt
root      120566  0.0  0.0  12140  1088 pts/0    S+   10:52   0:00 grep --color=auto tail
[root@hecs-34400 ~]# pmap -x 120169
120169:   tail -f d.txt
Address           Kbytes     RSS   Dirty Mode  Mapping
000056382bbd8000      64      64       0 r-x-- tail
000056382bde8000       4       4       4 r---- tail
000056382bde9000       4       4       4 rw--- tail
000056382d433000     132      32      32 rw---   [ anon ]
00007f8ffd69d000    2528     148       0 r---- LC_COLLATE
00007f8ffd915000    1776    1324       0 r-x-- libc-2.28.so
00007f8ffdad1000    2044       0       0 ----- libc-2.28.so
00007f8ffdcd0000      16      16      16 r---- libc-2.28.so
00007f8ffdcd4000       8       8       8 rw--- libc-2.28.so
00007f8ffdcd6000      16      12      12 rw---   [ anon ]
00007f8ffdcda000     180     180       0 r-x-- ld-2.28.so
00007f8ffde9f000     332     124       0 r---- LC_CTYPE
00007f8ffdef2000       4       4       0 r---- LC_NUMERIC
00007f8ffdef3000       4       4       0 r---- LC_TIME
00007f8ffdef4000       4       4       0 r---- LC_MONETARY
00007f8ffdef5000       4       4       0 r---- SYS_LC_MESSAGES
00007f8ffdef6000       4       4       0 r---- LC_PAPER
00007f8ffdef7000      28      28       0 r--s- gconv-modules.cache
00007f8ffdefe000       8       4       4 rw---   [ anon ]
00007f8ffdf00000       4       4       0 r---- LC_NAME
00007f8ffdf01000       4       4       0 r---- LC_ADDRESS
00007f8ffdf02000       4       4       0 r---- LC_TELEPHONE
00007f8ffdf03000       4       4       0 r---- LC_MEASUREMENT
00007f8ffdf04000       4       4       0 r---- LC_IDENTIFICATION
00007f8ffdf05000       8       8       8 rw---   [ anon ]
00007f8ffdf07000       4       4       4 r---- ld-2.28.so
00007f8ffdf08000       8       8       8 rw--- ld-2.28.so
00007ffd7f0a6000     132      12      12 rw---   [ stack ]
00007ffd7f144000      16       0       0 r----   [ anon ]
00007ffd7f148000       8       4       0 r-x--   [ anon ]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- ------- 
total kB            7360    2024     112

## 其实查看的就是/proc/pid/maps中的内容
[root@hecs-34400 ~]# cat /proc/120169/maps 
56382bbd8000-56382bbe8000 r-xp 00000000 fd:01 1055176                    /usr/bin/tail
56382bde8000-56382bde9000 r--p 00010000 fd:01 1055176                    /usr/bin/tail
56382bde9000-56382bdea000 rw-p 00011000 fd:01 1055176                    /usr/bin/tail
56382d433000-56382d454000 rw-p 00000000 00:00 0                          [heap]
7f8ffd69d000-7f8ffd915000 r--p 00000000 fd:01 1050889                    /usr/lib/locale/en_US.utf8/LC_COLLATE
7f8ffd915000-7f8ffdad1000 r-xp 00000000 fd:01 1050939                    /usr/lib64/libc-2.28.so
7f8ffdad1000-7f8ffdcd0000 ---p 001bc000 fd:01 1050939                    /usr/lib64/libc-2.28.so
7f8ffdcd0000-7f8ffdcd4000 r--p 001bb000 fd:01 1050939                    /usr/lib64/libc-2.28.so
7f8ffdcd4000-7f8ffdcd6000 rw-p 001bf000 fd:01 1050939                    /usr/lib64/libc-2.28.so
...

# 查看pid进程使用内存设别的详细情况
[root@hecs-34400 ~]# pmap -d 120169
120169:   tail -f d.txt
Address           Kbytes Mode  Offset           Device    Mapping
000056382bbd8000      64 r-x-- 0000000000000000 0fd:00001 tail
000056382bde8000       4 r---- 0000000000010000 0fd:00001 tail
000056382bde9000       4 rw--- 0000000000011000 0fd:00001 tail
000056382d433000     132 rw--- 0000000000000000 000:00000   [ anon ]
00007f8ffd69d000    2528 r---- 0000000000000000 0fd:00001 LC_COLLATE
00007f8ffd915000    1776 r-x-- 0000000000000000 0fd:00001 libc-2.28.so
00007f8ffdad1000    2044 ----- 00000000001bc000 0fd:00001 libc-2.28.so
00007f8ffdcd0000      16 r---- 00000000001bb000 0fd:00001 libc-2.28.so
00007f8ffdcd4000       8 rw--- 00000000001bf000 0fd:00001 libc-2.28.so
00007f8ffdcd6000      16 rw--- 0000000000000000 000:00000   [ anon ]
00007f8ffdcda000     180 r-x-- 0000000000000000 0fd:00001 ld-2.28.so
00007f8ffde9f000     332 r---- 0000000000000000 0fd:00001 LC_CTYPE
00007f8ffdef2000       4 r---- 0000000000000000 0fd:00001 LC_NUMERIC
00007f8ffdef3000       4 r---- 0000000000000000 0fd:00001 LC_TIME
00007f8ffdef4000       4 r---- 0000000000000000 0fd:00001 LC_MONETARY
00007f8ffdef5000       4 r---- 0000000000000000 0fd:00001 SYS_LC_MESSAGES
00007f8ffdef6000       4 r---- 0000000000000000 0fd:00001 LC_PAPER
00007f8ffdef7000      28 r--s- 0000000000000000 0fd:00001 gconv-modules.cache
00007f8ffdefe000       8 rw--- 0000000000000000 000:00000   [ anon ]
00007f8ffdf00000       4 r---- 0000000000000000 0fd:00001 LC_NAME
00007f8ffdf01000       4 r---- 0000000000000000 0fd:00001 LC_ADDRESS
00007f8ffdf02000       4 r---- 0000000000000000 0fd:00001 LC_TELEPHONE
00007f8ffdf03000       4 r---- 0000000000000000 0fd:00001 LC_MEASUREMENT
00007f8ffdf04000       4 r---- 0000000000000000 0fd:00001 LC_IDENTIFICATION
00007f8ffdf05000       8 rw--- 0000000000000000 000:00000   [ anon ]
00007f8ffdf07000       4 r---- 000000000002d000 0fd:00001 ld-2.28.so
00007f8ffdf08000       8 rw--- 000000000002e000 0fd:00001 ld-2.28.so
00007ffd7f0a6000     132 rw--- 0000000000000000 000:00000   [ stack ]
00007ffd7f144000      16 r---- 0000000000000000 000:00000   [ anon ]
00007ffd7f148000       8 r-x-- 0000000000000000 000:00000   [ anon ]
ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 7360K    writeable/private: 316K    shared: 28K

vmstat

vmstat命令的全称是"Virtual Memory Statistics",是一个用于显示Linux系统中虚拟内存使用情况的命令。vmstat命令可以提供有关系统内存、进程、CPU等方面的数据

# 采集信息,每隔2秒采集一次,采集3次
[root@hecs-34400 ~]# vmstat 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 887668 284488 2319080    0    0     0     2    3    7  0  0 100  0  0
 1  0      0 887532 284488 2319080    0    0     0     0  156  224  0  0 100  0  0
 0  0      0 887532 284488 2319080    0    0     0     6  160  246  0  0 100  0  0

iostat命令

iostat全称是"Input/Output Statistics"

从磁盘的角度来查看读写性能

用于监测磁盘读写速度,I/O请求队列长度,cpu使用率等信息

# 使用方式
iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [ ... ] | ALL ] [ -p [ device | ALL ]  ]
       [ interval [ count ] ]
       
# 示例
# 显示CPU和I/O系统的负载情况及分区状态信息
[root@restoredb ~]# iostat
Linux 4.19.91-26.an8.x86_64 (restoredb)         06/06/2023      _x86_64_        (64 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.02    0.00    0.00   99.92

Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.30         2.51        19.53   26937364  209143182
sdb              11.48      2096.08      6217.42 22451103696 66594895233
dm-0              0.38         2.45        19.35   26198904  207213400
dm-1              0.02         0.02         0.07     174096     760088
dm-2              0.00         0.05         0.11     526308    1139904
dm-3             11.57      2096.08      6217.42 22451091736 66594894404
loop0             0.00         0.03         0.00     329984          0
说明:
cpu部分:
%usr CPU在用户模式下的时间百分比
%nice CPU处在带NICE值的用户模式下的时间百分比
%system CPU在系统模式下的时间百分比
%iowait CPU等待输入输出完成时间的百分比
%steal 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
%idle CPU空闲时间百分比

device部分:
tps 该设备每秒的传输次数。“一次传输"意思是"一次I/O请求”。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。
kB_read/s 每秒从设备读取的数据量
kB_wrtn/s 每秒向设备写入的数据量
kB_read 读取的总数据量
kB_wrtn 写入的总数据量

# 以M为单位显示信息
[root@restoredb ~]# iostat -m
Linux 4.19.91-26.an8.x86_64 (restoredb)         06/06/2023      _x86_64_        (64 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.02    0.00    0.00   99.92

Device             tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda               0.30         0.00         0.02      26306     204241
sdb              11.48         2.05         6.07   21924905   65034077
dm-0              0.38         0.00         0.02      25584     202356
dm-1              0.02         0.00         0.00        170        742
dm-2              0.00         0.00         0.00        513       1113
dm-3             11.57         2.05         6.07   21924894   65034076
loop0             0.00         0.00         0.00        322          0

# 只显示cpu和只显示device部分
[root@restoredb ~]# iostat -c
Linux 4.19.91-26.an8.x86_64 (restoredb)         06/06/2023      _x86_64_        (64 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.02    0.00    0.00   99.92
           
[root@restoredb ~]# iostat -d -m
Linux 4.19.91-26.an8.x86_64 (restoredb)         06/06/2023      _x86_64_        (64 CPU)

Device             tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda               0.30         0.00         0.02      26306     204241
sdb              11.48         2.05         6.07   21924905   65034077
dm-0              0.38         0.00         0.02      25584     202356
dm-1              0.02         0.00         0.00        170        742
dm-2              0.00         0.00         0.00        513       1113
dm-3             11.57         2.05         6.07   21924894   65034076
loop0             0.00         0.00         0.00        322          0

# 刷新显示
[root@restoredb ~]# iostat 2 3 //每隔2秒显示刷新1此,一共刷新显示3次

# 扩展信息显示
[root@restoredb ~]# iostat -x
Linux 4.19.91-26.an8.x86_64 (restoredb)         06/06/2023      _x86_64_        (64 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.02    0.00    0.00   99.92

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
sda              0.03    0.27      2.51     19.52     0.00     0.10   6.71  27.27    1.50   19.07   0.01    80.12    72.82   0.18   0.01
sdb              2.93    8.55   2095.92   6216.97     0.00     0.09   0.02   1.04    1.16    8.95   0.08   714.95   727.43   0.24   0.28
dm-0             0.03    0.35      2.45     19.34     0.00     0.00   0.00   0.00    1.51   20.76   0.01    83.82    54.65   0.14   0.01
dm-1             0.00    0.01      0.02      0.07     0.00     0.00   0.00   0.00    0.40   19.76   0.00     4.04     5.22   0.12   0.00
dm-2             0.00    0.00      0.05      0.11     0.00     0.00   0.00   0.00    8.40   24.67   0.00   204.87    93.94   0.24   0.00
dm-3             2.93    8.64   2095.92   6216.97     0.00     0.00   0.00   0.00    1.15    9.02   0.08   714.83   719.86   0.24   0.28
loop0            0.00    0.00      0.03      0.00     0.00     0.00   0.00   0.00    0.24    0.00   0.00    70.08     0.00   0.12   0.00
r/s:每秒读请求
w/s:每秒写请求
rkb/s:每秒读kb数
wkb/s:每秒写kb数
rrqm/s:read request mereded were queue每秒排队的合并的读请求
wrqm/s:每秒排队的合并的写请求
r_await:读平均等待时间
w_await:写平均等待时间
aqu-sz:发布的请求的平均队列大小
util:硬盘工作饱和率

# 单独查看某个硬盘的信息
[root@restoredb ~]# iostat sda
Linux 4.19.91-26.an8.x86_64 (restoredb)         06/06/2023      _x86_64_        (64 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.02    0.00    0.00   99.92

Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.30         2.51        19.52   26937364  209145070

[root@restoredb ~]# iostat -x sda
Linux 4.19.91-26.an8.x86_64 (restoredb)         06/06/2023      _x86_64_        (64 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.02    0.00    0.00   99.92

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
sda              0.03    0.27      2.51     19.52     0.00     0.10   6.71  27.27    1.50   19.07   0.01    80.12    72.81   0.18   0.01

iotop命令

从进程的角度来查看读写性能

用于显示磁盘I/O使用情况的实用工具。它可以实时显示哪些进程正在读取或写入磁盘,以及它们使用的磁盘I/O带宽和I/O延迟等信息。通过iotop命令,用户可以快速了解系统中每个进程的I/O负载情况,从而找出哪些进程占用了过多的磁盘I/O资源,进而进行调整和优化。

# 示例:
[root@restoredb ~]# iotop
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
    TID  PRIO  USER     DISK READ DISK WRITE>    COMMAND                                                                      
      1 be/4 root        0.00 B/s    0.00 B/s systemd --switched-root --system --deserialize 17
      2 be/4 root        0.00 B/s    0.00 B/s [kthreadd]
      3 be/0 root        0.00 B/s    0.00 B/s [rcu_gp]
      4 be/0 root        0.00 B/s    0.00 B/s [rcu_par_gp]
      6 be/0 root        0.00 B/s    0.00 B/s [kworker/0:0H-kblockd]
      8 be/4 root        0.00 B/s    0.00 B/s [kworker/u128:0-netns]
Total DISK READ:磁盘读取总速率
Total DISK WRITE:磁盘写总速率
Actual DISK READ:磁盘读实际速率
Actual DISK WRITE:磁盘写实际速率
TID:线程ID,按p可转换成进程ID
PRIO:优先级
USER:线程所有者
DISK READ:从磁盘中读取的速率
DISK WRITE:往磁盘里写入的速率
COMMAND:具体的进程命令

# 显示实际读写的进程
[root@restoredb mysql8]# iotop -o
或者
进入iotop后按o

# 监测次数
[root@restoredb mysql8]# iotop -n 2
# 间隔时间
[root@restoredb mysql8]# iotop -d 2 -n 2 //间隔2秒显示1次,总共显示2次
# 指定进程和指定用户
[root@restoredb mysql8]# iotop -p pid
[root@restoredb mysql8]# iotop -u admin
# 只显示进程不显示线程
[root@restoredb mysql8]# iotop -P

iftop命令

安装:

要么从epel源安装,要么下载到本地安装http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz

下载到本地安装,需要安装libpcap-devel

iftop显示的是针对ip:端口的流量监控

界面命令:

按h切换是否显示帮助;
按n切换显示本机的IP或主机名;
按s切换是否显示本机的host信息;
按d切换是否显示远端目标主机的host信息;
按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
按N切换显示端口号或端口服务名称;
按S切换是否显示本机的端口信息;
按D切换是否显示远端目标主机的端口信息;
按p切换是否显示端口信息;
按P切换暂停/继续显示;
按b切换是否显示平均流量图形条;
按B切换计算2秒或10秒或40秒内的平均流量;
按T切换是否显示每个连接的总流量;
按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
按j或按k可以向上或向下滚动屏幕显示的连接记录;
按1或2或3可以根据右侧显示的三列流量数据进行排序;
按<根据左边的本机名或IP排序;
按>根据远端目标主机的主机名或IP排序;
按o切换是否固定只显示当前的连接;
按f可以编辑过滤代码
按!可以使用shell命令
按q退出监控

nload命令

nload是针对网卡的流量监控

nload默认使用的是ens33网卡,若想监控其他网卡,可以在命令后方加上需要监控的网卡

下载地址:http://www.roland-riegel.de/nload/nload-0.7.4.tar.gz

参数 说明
Incoming 进入网卡的流量
Outgoing 从网卡流出的流量
Curr 当前流量
Avg 平均流量
Min/Max 最大/最小流量
Ttl 流量总和
# -u 修改显示单位
# h|b|k|m|g h: auto, b: Bit/s, k: kBit/s, m: MBit/s etc. 
# H|B|K|M|G H: auto, B: Byte/s, K: kByte/s, M: MByte/s etc.
[root@hecs-34400 ~]# nload -u m
Device eth0 [192.168.0.76] (1/2):
==
Incoming:
Curr: 0.00 MBit/s
Avg: 0.00 MBit/s
Min: 0.00 MBit/s
Max: 0.00 MBit/s
Ttl: 3.20 GByte

# 只显示数据统计,不显示流量图
[root@hecs-34400 ~]# nload -m

nethogs命令

是一个根据进程来监测流量的工具

# 监控eth0网卡流量
[root@hecs-34400 ~]# nethogs eth0
NetHogs version 0.8.5

    PID USER     PROGRAM DEV SENT      RECEIVED  
 122558 duzy     sshd: duzy@pts/0                                                            eth0        0.167       0.039 KB/sec
      ? root     unknown TCP                                                                             0.000       0.000 KB/sec

# 监控时,刷新频率为3秒,总2次
[root@hecs-34400 ~]# nethogs eth0 -d 3 -c 2

# 按照MB单位显示流量
# 网卡流量显示单位,默认KB,(0 = KB/s, 1 = total KB, 2 = total B, 3 = total MB)
[root@hecs-34400 ~]# nethogs eth0 -v 3

# 监控所有网卡流量
[root@hecs-34400 ~]# nethogs -a

iptraf-ng命令

iptraf-ng的全称是“IP Traffic Monitor Next Generation”下一代ip流量监控工具

# 使用帮助
[root@hecs-34400 ~]# iptraf-ng -h
usage: iptraf-ng [options]
   or: iptraf-ng [options] -B [-i <iface> | -d <iface> | -s <iface> | -z <iface> | -l <iface> | -g]

    -h, --help            show this help message

    -i <iface>            start the IP traffic monitor (use '-i all' for all interfaces)
    -d <iface>            start the detailed statistics facility on an interface
    -s <iface>            start the TCP and UDP monitor on an interface
    -z <iface>            shows the packet size counts on an interface
    -l <iface>            start the LAN station monitor (use '-l all' for all LAN interfaces)
    -g                    start the general interface statistics

    -B                    run in background (use only with one of the above parameters
    -f                    clear all locks and counters
    -t <n>                run only for the specified <n> number of minutes
    -L <logfile>          specifies an alternate log file

# 监控eth0的流量,-i --interface,-i all表示监测所有网卡
# 这个命令的特点是会显示端口
[root@hecs-34400 ~]# iptraf-ng -i eth0
 iptraf-ng 1.2.1
l TCP Connections (Source Host:Port) qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Packets qqqqqqqqqqq Bytes qq Flag qq Iface qqqqqqqqqk
xl218.205.242.246:50840                                                   >       97             5068    --A-    eth0           x
xm192.168.0.76:18728                                                      >      173            41120    -PA-    eth0           x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
m TCP:      1 entries qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Active qj
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
x                                                                                                                               x
mqqqqqqqqqqqqqq Time:   0:00 qqqqqqqqqqq Drops:         0 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
 Packets captured:                                            270       x  TCP flow rate:	     7.17 kbps
 Up/Dn/PgUp/PgDn-scroll  M-more TCP info   W-chg actv win  S-sort TCP  X-exit

# 使用通用监测,显示所有网卡上的流量
[root@hecs-34400 ~]# iptraf-ng -g
 iptraf-ng 1.2.1
l Iface qqqqqqqqqqqqqqqqqq Total qqqqqqqqqq IPv4 qqqqqqqqqq IPv6 qqqqqqqqq NonIP qqqqqq BadIP qqqqqqqqqqq Activity qqqqqqqqqqqqqk
x eth0                       142             142               0               0            0             33.54 kbps            x
x lo                           0               0               0               0            0              0.00 kbps            x

# 详细统计eth0上的流量信息,-d --detail
[root@hecs-34400 ~]# iptraf-ng -d eth0
 iptraf-ng 1.2.1
l Statistics for eth0 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x                                                                                                                               x
x               Total      Total    Incoming   Incoming    Outgoing   Outgoing                                                  x
x             Packets      Bytes     Packets      Bytes     Packets      Bytes                                                  x
x Total:          223      43752          82       4264         141      39488                                                  x
x IPv4:           223      43752          82       4264         141      39488                                                  x
x IPv6:             0          0           0          0           0          0                                                  x
x TCP:            223      43752          82       4264         141      39488                                                  x
x UDP:              0          0           0          0           0          0                                                  x
x ICMP:             0          0           0          0           0          0                                                  x
x Other IP:         0          0           0          0           0          0                                                  x
x Non-IP:           0          0           0          0           0          0                                                  x
x Broadcast:        0          0           0          0           0          0                                                  x
x                                                                                                                               x
x Total rates:         55.19 kbps            Broadcast rates:        0.00 kbps                                                  x
x                         36 pps                                        0 pps                                                   x
x                                                                                                                               x
x Incoming rates:       5.51 kbps                                                                                               x
x                         12 pps                                                                                                x
x                                            IP checksum errors:        0                                                       x
x Outgoing rates:      49.67 kbps                                                                                               x
x                         22 pps                             

# 统计eth0上的udp和tcp流量
[root@hecs-34400 ~]# iptraf-ng -s eth0

dstat命令

比较全能的一个命令,可以监控系统的很多方面,包括cpu,磁盘,负载,内存等

# 命令格式
dstat [option] [<delay>] [<count>] 
默认参数是-cdngy
# 命令参数
-c 或 --cpu: 监控 CPU 的使用率,包括 user、system、idle、wait、hard IRQ 和 soft IRQ 等方面。
-d 或 --disk: 监控系统磁盘的实时读写速率,包括 read、write、total、avactive 和 util 等方面。其中,avactive 实时显示 I/O 请求等待时间的平均值,util 显示磁盘使用率的百分比。
-g 或 --page: 监控内存和分页文件的使用情况,包括 page in、page out、page fault、swap in 和 swap out 等指标。
-i 或 --int: 监控网络接口的实时流量,包括 recv、send、total、tcp、udp、icmp 等指标。
-l 或 --load: 监控系统负载的实时情况,包括 1 分钟、5 分钟和 15 分钟内的负载平均值。
-m 或 --mem: 监控内存的使用情况,包括 used、buff、cach 和 free 等指标。
-n 或 --net: 监控网络的实时连接,包括 active 和 passive 等指标。
-p 或 --proc: 监控活跃进程和它们使用的资源,包括 process、memory、swap、io、system、cpu 等方面。
-s 或 --swap: 监控交换内存的实时使用情况,包括 used、free、in 和 out 等指标。
-y 或 --sys: 监控内核的引用计数和活动数量,包括 interrupt、context-switch、fork 等指标。
示例:
# 默认监控cpu,disk,net,page,sys
[root@hecs-34400 ~]# dstat
You did not select any stats, using -cdngy by default.
----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw 
  0   0 100   0   0|   0     0 |  66B  661B|   0     0 | 184   255 
  1   0 100   0   0|   0     0 |  66B  326B|   0     0 | 171   250 
  0   0 100   0   0|   0     0 |  66B  342B|   0     0 | 155   238 
  0   0 100   0   0|   0     0 |  66B  326B|   0     0 | 157   235

# 间隔2秒,显示次数3次
[root@hecs-34400 ~]# dstat -d 2 -c 3

glances命令

glances是一款类似于top、htop的命令行系统性能监测工具,可以实时监测CPU、内存、磁盘、网络等多个系统指标,并以易于查看的方式进行展示

显示界面类似与top和htop

h : 显示帮助信息
q : 离开程序退出
c :按照 CPU 实时负载对系统进程进行排序
m :按照内存使用状况对系统进程排序
i:按照 I/O 使用状况对系统进程排序
p: 按照进程名称排序
d : 显示磁盘读写状况 
w : 删除日志文件
l :显示日志
s: 显示传感器信息
f : 显示系统信息
1 :轮流显示每个 CPU 内核的使用情况(次选项仅仅使用在多核 CPU 系统)
2,3,4,5:可以选择不同界面风格

cockpit

cockpit是一个web界面的Linux系统管理工具,可以通过浏览器远程管理多台Linux服务器,以图形化的方式展示系统各种信息和状态,如CPU、内存、磁盘、网络、用户、服务、日志等等,还可以进行系统配置、软件包管理、用户管理、防火墙设置等操作。cockpit支持多种主流Linux发行版,可以通过简单的命令安装并启动

安装: yum install cockpit

通过systemctl管理

访问:通过ip:9090访问

打开防火墙:

sudo firewall-cmd --add-service=cockpit --permanent
sudo firewall-cmd --reload

kill命令

kill命令用于向进程发送信号

信号列表如下:

[root@localhost ~]# kill -l

  1. SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
  2. SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
  3. SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
  4. SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
  5. SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
  6. SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
  7. SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
  8. SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
  9. SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
  10. SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
  11. SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
  12. SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
  13. SIGRTMAX-1 64) SIGRTMAX

常用信号:1(重新加载进程),9(杀死进程),15(正常停止进程,默认)

使用方式:kill -signid pid

# 杀死一个进程
[root@localhost ~]# ps uax | grep tail
natasha    43573  0.0  0.0 217116   880 pts/0    S    09:51   0:00 tail -f test.log
root       43661  0.0  0.0 221936  1100 pts/0    S+   09:57   0:00 grep --color=auto tail
[root@localhost ~]# kill -9 43573

kill,pkill,killall的区别

进程ID唯一,所以kill一次只能杀死1个进程,其他相同名称的进程仍然存在,而pkill和killall,则可以一次杀死所有拥有相同名称的进程.

kill 命令用于杀死指定进程ID的进程

killall命令用于杀死指定名字的进程
pkill和kill用法相同,不同的地方在于kill指定的进程ID,pkill指定的是进程名

killall和pkill的用法几乎相同,但pkill可以指定非完整名称,而killall则必须指定完整进程名称

# 使用killall杀死nginx
[root@localhost ~]# ps aux| grep nginx
root       48054  0.0  0.0 119196  2172 ?        Ss   15:00   0:00 nginx: master process /usr/sbin/nginx
nginx      48055  0.0  0.2 151900  7988 ?        S    15:00   0:00 nginx: worker process
nginx      48056  0.0  0.2 151900  8112 ?        S    15:00   0:00 nginx: worker process
nginx      48057  0.0  0.2 151900  8072 ?        S    15:00   0:00 nginx: worker process
nginx      48058  0.0  0.2 151900  8060 ?        S    15:00   0:00 nginx: worker process
root       48072  0.0  0.0 221936  1100 pts/0    S+   15:00   0:00 grep --color=auto nginx
[root@localhost ~]# killall nginx
[root@localhost ~]# ps aux| grep nginx
root       48079  0.0  0.0 221936  1084 pts/0    S+   15:00   0:00 grep --color=auto nginx
[root@localhost ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

6月 07 15:00:18 localhost.localdomain systemd[1]: nginx.service: Unit cannot be reloaded because it is inactive.
6月 07 15:00:31 localhost.localdomain systemd[1]: Starting The nginx HTTP and reverse proxy server...
6月 07 15:00:31 localhost.localdomain nginx[48051]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
6月 07 15:00:31 localhost.localdomain nginx[48051]: nginx: configuration file /etc/nginx/nginx.conf test is successful
6月 07 15:00:31 localhost.localdomain systemd[1]: Started The nginx HTTP and reverse proxy server.
6月 07 15:00:51 localhost.localdomain systemd[1]: nginx.service: Succeeded.

# 使用pkill杀死nginx,注意使用pkill不用输入完整的进程名称
[root@localhost ~]# pkill ngin
[root@localhost ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

jobs命令

jobs 命令可以用来查看当前终端放入后台的工作,工作管理的名字也来源于 jobs 命令。

使用&或者ctrl+z将任务放入后台执行;使用&在后台仍然会执行,使用ctrl+z在后台会暂停

注意,jobs只会显示当前会话中的后台命令,如果另外开一个会话,jobs结果为空

选项 含义
-l(L 的小写) 列出进程的 PID 号。
-n 只列出上次发出通知后改变了状态的进程。
-p 只列出进程的 PID 号。
-r 只列出运行中的进程。
-s 只列出已停止的进程。
# 永久循环脚本
[root@localhost data]# cat loop.sh 
#!/bin/bash

while true;do
   echo "hello while." >> /data/loop.log
   sleep 1
done

# 永久循环脚本放入后台执行,3次,2次&,一次ctrl+z
[root@localhost data]# jobs
[2]   运行中               bash loop.sh &
[3]-  运行中               bash loop.sh &
[4]+  已停止               bash loop.sh
可以看到,当前终端有3个后台工作:工作号为 3,状态是运行中,标志是"-";一个工作号为 4,状态是已停止,标志是"+"。"+"号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。"-"号代表倒数第二个放入后台的工作,而第三个以后的工作就没有"+-"标志了。
一旦当前的默认工作处理完成,则带减号的工作就会自动成为新的默认工作,换句话说,不管此时有多少正在运行的工作,任何时间都会有且仅有一个带加号的工作和一个带减号的工作。

# 测试选项
[root@localhost data]# jobs -l
[1]- 48727 运行中               bash loop.sh &
[2]+ 48729 运行中               bash loop.sh &
[root@localhost data]# jobs -p
48727
48729
[root@localhost data]# jobs -r
[1]-  运行中               bash loop.sh &
[2]+  运行中               bash loop.sh &

# 使用fg将后台任务放入前台执行
[root@localhost data]# fg 1
bash loop.sh

# 使用bg将后台停止任务继续执行
[root@localhost data]# jobs
[2]   运行中               bash loop.sh &
[3]-  运行中               bash loop.sh &
[4]+  已停止               bash loop.sh
[root@localhost data]# bg 4
[4]+ bash loop.sh &
[root@localhost data]# jobs
[2]   运行中               bash loop.sh &
[3]-  运行中               bash loop.sh &
[4]+  运行中               bash loop.sh &

# 注意,当前会话退出后,这些后台任务会被杀死

使用nohup + & 将任务放入后台执行,且当前会话退出后仍可以继续执行

# 使用nohup将任务放入后台
[root@localhost data]# nohup bash loop.sh &
[1] 49809
[root@localhost data]# nohup: 忽略输入并把输出追加到'nohup.out'

# 查看是否任务是否继续执行,仍然在继续执行
[root@localhost data]# tail -f loop.log

# 查看详情
systemd(1)─┬─ModemManager(997)─┬─{ModemManager}(1036)
           │                   └─{ModemManager}(1044)
           ├─bash(49809)───sleep(49926)
[root@localhost data]# ps aux | grep loop
root       49809  0.0  0.0 222524  3112 ?        S    15:28   0:00 bash loop.sh

可以看见,当会话退出后,进程被1号进程接管,所以可以继续执行

crontab命令

crontab命令依附与cron进程存在,crontab会每分钟扫描需要执行的任务

crontab的日志存放在/var/log/cron中

格式为

分 时 天 月 星期 命令

定时任务存放的位置是:

[root@localhost data]# cat /var/spool/cron/root
*/1 * * * * echo "123" >> /data/loop.log

需要注意的是: crontab的PATH和系统的PATH不一致,所以有些命令需要写绝对路径

crontab的PATH:

/usr/bin:/bin

系统的PATH:

[root@localhost data]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# 查看定时任务
[root@localhost data]# crontab -l 
*/1 * * * * echo "123"  >> /data/loop.log

# 查看日志
[root@localhost data]# tail -n 20 /var/log/cron
Jun  7 15:44:01 localhost CROND[50362]: (root) CMD (echo "123"  >> /data/loop.log)

索引数组和关联数组

索引数组就是以数字为下表的数组,在各个变成语言中都有类似的数据结构,一般都称为数组

关联数组类似与其它编程语言的字典,下标为字符串

关联数组的下标可以是任意字符串。关联数组的索引要求具有唯一性,但索引和值可以不一样。

# 索引数组
[root@localhost data]# cat sysz.sh 
#!/bin/bash
# 声明一个索引数组
declare -a sz=("tom" "cat" "dog" "mouse")
echo "first item is: ${sz[0]}"
echo "second item is: ${sz[1]}"
echo "third item is: ${sz[2]}"
echo "forth item is: ${sz[3]}"

# 添加一个元素到数组
echo "add item to sz:"
sz[4]="new"
echo "new item is: ${sz[4]}"

# 删除一个元素,清空整个数组是unset sz
echo "delete item:"
echo "before delete:${sz[@]}"
unset sz[3]
echo "after delete:${sz[@]}"

# 更改一个元素内容
echo "change second item value:"
sz[1]="change"
echo "second item change to : ${sz[1]}"

# 获取所有元素内容
echo "Get All item:"
echo "${sz[@]}"
echo "${sz[*]}"

# 获取元素个数,也就是元素长度
echo "Get length of sz:"
echo "${#sz[*]}"
echo "${#sz[@]}"

# 获取最后一个元素
echo "Get last itme:"
echo "${sz[-1]}"

# 获取所有元素下标
echo "Get all index:"
echo "${!sz[@]}"

# 获取子数组,包前不包后
echo "Get child slice":
echo "${sz[@]:2:3}"

[root@localhost data]# bash sysz.sh 
first item is: tom
second item is: cat
third item is: dog
forth item is: mouse

add item to sz:
new item is: new

delete item:
before delete:tom cat dog mouse new
after delete:tom cat dog new

change second item value:
second item change to : change

Get All item:
tom change dog new
tom change dog new

Get length of sz:
4
4

Get last itme:
new

Get all index:
0 1 2 4

Get child slice:
dog new
# 关联数组
[root@localhost data]# cat glsz.sh 
#!/bin/bash

declare -A sz=([mon]="Monday" [tue]="Tuesday" [wed]="Wednesday" [thu]="Thursday" [fri]="Friday" [sat]="Saturday")

echo "All item:${sz[@]}"
echo "add sunday item:"
sz[sun]="Sunday"
echo "All item:${sz[@]}"
echo "add tmp item:"
sz[tmp]="Temp"
echo "All item:${sz[@]}"

echo "delete item "tmp":"
echo "before delete:${sz[*]}"
unset sz[tmp]
echo "after delete tmp:${sz[@]}"

echo "change sunday value to lalalala"
sz[sun]="lalalala"
echo "after change all item:${sz[*]}"

echo "all item is:"
echo "${sz[@]}"

echo "All value of sz:"
echo "${sz[@]}"

echo "All index of sz:"
echo "${!sz[@]}"

echo "the length of sz:"
echo "${#sz[*]}"

[root@localhost data]# bash glsz.sh 
All item:Monday Tuesday Friday Saturday Thursday Wednesday

add sunday item:
All item:Monday Tuesday Friday Saturday Sunday Thursday Wednesday
add tmp item:
All item:Monday Temp Tuesday Friday Saturday Sunday Thursday Wednesday

delete item tmp:
before delete:Monday Temp Tuesday Friday Saturday Sunday Thursday Wednesday
after delete tmp:Monday Tuesday Friday Saturday Sunday Thursday Wednesday

change sunday value to lalalala
after change all item:Monday Tuesday Friday Saturday lalalala Thursday Wednesday

all item is:
Monday Tuesday Friday Saturday lalalala Thursday Wednesday

All value of sz:
Monday Tuesday Friday Saturday lalalala Thursday Wednesday

All index of sz:
mon tue fri sat sun thu wed

the length of sz:
7

字符串处理

# 脚本如下
[root@localhost data]# cat string.sh 
#!/bin/bash
# 初始化var变量
var="hello,i am new bird!i am a new learner"
# 打印var
echo $var
# 打印var长度
echo ${#var}
# 截取0-5的子字符串
echo "get index 0-5 substring:"
echo "${var:0:5}"
# 替换,只替换匹配的第一个和替换所有匹配到的
echo "replace am to not"
echo "only replace first one:"
echo "${var/am/not}"
echo "replace all word am:"
echo "${var//am/not}"
# 从左往右开始匹配,分为非贪婪和贪婪模式
echo "from left begin match to delete:"
echo "least match"
echo "${var#*am}"
echo "more match"
echo "${var##*am}"
# 从右往左开始匹配,分为非贪婪和贪婪模式
echo "from right begin match to delete"
echo "lease match"
echo "${var%am*}"
echo "more match"
echo "${var%%am*}"
# 当输出的时候,变量为空就会输出默认字符串lalalala
# 还有其它的配置,但是对于没有配置和空字符串都不一定全匹配,所以一般还是用${var:-expr}或者${var:=expr},这两对于未配置和空都是将var设置未expr的值
unset var
echo "${var:-lalalalal}"

[root@localhost data]# bash string.sh 
hello,i am new bird!i am a new learner

38

get index 0-5 substring:
hello

replace am to not
only replace first one:
hello,i not new bird!i am a new learner
replace all word am:
hello,i not new bird!i not a new learner

from left begin match to delete:
least match
 new bird!i am a new learner
more match
 a new learner
 
from right begin match to delete
lease match
hello,i am new bird!i 
more match

hello,i 
lalalalal
变量配置方式 Str没有配置 Str为空字符串 Str已配置且非空
var=$ var=expr var= var=$str
var=$ var=expr var=expr var=$str
var=$ var= var=expr var=expr
var=$ var= var= var=expr
var=$ var=expr var var=$str
var= var=expr var=expr var=$str
#!/bin/bash

var="hello,i am new bird!i am a new learner"

subvar="hello"
# 找到子字符串在字符串中第一次出现的位置
echo "find index of hello in var:"
echo `expr index "$var" "$subvar"`
# 找到的子字符串的长度
echo "get length of substring:"
echo `expr match "$var" "$subvar"`

[root@localhost data]# bash string.sh 
find index of hello in var:
1
get length of substring:
5

求10个随机数的最大值与最小值

[root@localhost data]# cat maxmin.sh 
#!/bin/bash

max=0
min=100
for i in {1..10};do
   ran=$((RANDOM%100))
   if [ $ran -lt $min ];then
      min=$ran
   elif [ $ran -gt $max ];then
      max=$ran
   fi
done
echo $max
echo $min

[root@localhost data]# bash maxmin.sh 
77
33

使用递归调用,完成阶乘算法实现

[root@localhost data]# cat dg.sh 
#!/bin/bash

function dg(){
   if [ ! -n "$1" ];then
      echo "args 1 is not defined."
      return 1023
   fi
   n=$1
   if [ $n -eq 1 ];then
      echo 1
      return
   fi
   let temp=n-1
   next=$(dg $temp)
   result=$((n*next))
   echo $result
}

m=$1
res=$(dg $m)
echo $res

进程和线程的区别

1. 资源消耗方面:进程是操作系统分配资源的基本单位,每个进程都有自己的地址空间、内存、文件句柄、环境变量等系统资源,因此进程的资源消耗较大;而线程是进程内部的可执行单元,它与进程共享相同的地址空间和系统资源,因此相比进程,线程的资源消耗较小。
2. 切换开销方面:由于进程有独立的地址空间和系统资源,因此进程间的切换开销较大,需要保存和恢复大量的上下文信息;而线程只需要保存和恢复少量的寄存器和堆栈信息,因此线程间的上下文切换开销较小。
3. 并发性和多核处理方面:由于进程有独立的地址空间和系统资源,因此进程间并发性较好,可以同时执行多个进程,每个进程可以分配到不同的CPU核心上,从而充分利用多核处理的优势;而线程只是进程内部的执行单元,它们共享进程的地址空间和系统资源,因此线程的并发性较差,多个线程只能在同一个CPU核心上轮流执行,不能充分利用多核处理的优势。
4. 编程模型方面:由于进程是独立的执行单元,进程间通信需要使用IPC(Inter-Process Communication)机制,如管道、消息队列、共享内存等;而线程是共享进程内存和系统资源的执行单元,线程间通信可以直接通过共享内存等方式来实现。
综上所述,进程和线程各有优缺点,应根据实际应用场景进行选择。一般而言,当需要同时执行多个不同的任务、需要更好的并发性和多核处理性能、需要更好的安全性和稳定性时,应优先考虑使用进程;当需要执行相对简单的、密集型的计算任务、需要更好的响应速度和资源利用率时,应优先考虑使用线程。

解析进程的结构

1. 程序段(代码段):进程的程序段是可执行文件的内容,它包含了进程的代码和常量数据。
2. 数据段:数据段是进程所需的数据存储区域,包括全局变量、静态变量和常量等数据。
3. 堆区:堆区是动态分配内存的区域,程序可以在运行时申请和释放堆内存。
4. 栈区:栈区用于存储局部变量和程序调用栈信息,随着函数的调用和返回,栈区的大小会动态变化。
5. 进程控制块(Process Control Block,PCB):进程控制块是操作系统中用来描述和管理进程的数据结构,它包含了进程的状态、优先级、PID(进程标识符)、所属用户等信息,以及进程的资源占用情况、CPU寄存器状态、堆栈指针等上下文信息。
6. 系统资源:进程需要操作系统提供的各种资源,如内存、文件、输入输出设备等。

解析磁盘中的代码如何在计算机上运行的

  机器只能执行机器码语言,不同cpu能够理解的语言还不一样,比如inter的cpu与ARM的cpu能够理解的指令集就不一样,所以安装软件的时候,会有inter版本和ARM版本。
  对于编译性语言,在编写代码完成后,会将程序编译成计算机能够理解的机器语言,程序运行时,会拷贝一个副本到内存中,cpu就逐条执行副本中的机器语言。
  对于解释性语言,编写代码完成后,仍然是文本,所以需要一个解释器,将逐行的文本编译成机器语言传递给cpu执行

总结OOM原理,及处理方法

OOM(Out of Memory)是指内存不足的错误。它通常是由于程序在运行时申请的内存超出了操作系统给定的限制导致的。OOM可能会导致程序运行出现异常,甚至崩溃。
OOM原理:程序在运行时需要申请一定的内存空间,如果可用内存空间不足以满足程序需求,则操作系统就会报告OOM错误。该错误通常在程序运行时被检测到,导致程序异常终止。
处理方法:
1.优化内存使用:在代码中避免使用大量的内存,尽量减少内存泄漏的发生。
2.增加内存:如果程序需要处理的数据量很大,可以考虑增加系统的内存。
3.分批处理数据:将大量数据分成小批量处理,避免一次性加载所有数据导致内存不足。
4.使用虚拟内存:虚拟内存是一种将磁盘空间作为内存使用的技术,可以将一部分内存数据存储到磁盘上,从而扩大可用内存。
5.使用内存映射文件:内存映射文件是一种将磁盘文件映射到内存地址空间的技术,可以降低内存的占用。
6.使用垃圾回收机制:垃圾回收机制可以自动回收不再使用的内存,避免内存泄漏的发生。
7.使用压缩算法:对于一些数据量较大的数据,可以使用压缩算法进行压缩,降低内存的使用。
8.使用缓存:使用缓存可以将经常使用的数据保存在内存中,避免频繁地从磁盘读取数据。
9.使用64位操作系统:64位操作系统可以支持更大的内存地址空间,可以解决一些内存不足的问题。
总之,避免OOM错误的关键在于优化内存使用,尽量减少内存泄漏的发生,并采取合适的处理方法。

结合进程管理命令,说明进程各种状态

Linux进程状态:
1:可执行状态
2:可终端的睡眠状态
3:不可中断的睡眠状态
4:暂停状态
5:跟踪状态
6:僵死状态
7:退出状态
这些状态的判定依据是与CPU的关系来划分,也是为了更好的管理CPU

# 脚本如下:
[root@localhost data]# cat loop.sh 
#!/bin/bash
i=0
while true;do
   echo "hello while." >> /data/loop.log
done

# 运行起来就是R状态,即运行态
[root@localhost data]# ps aux | grep 2568
root        2568 97.1  0.0 222524  1220 pts/0    R    13:55   0:09 bash loop.sh
root        2570  0.0  0.0   6936   332 pts/1    R+   13:55   0:00 grep --color=auto 2568

# 使用ctrl+z将脚本运行放入后台,此时,进程就是T(Stop)停止态
[root@localhost data]# bash loop.sh 
^Z
[1]+  已停止               bash loop.sh
[root@localhost data]# ps uax | grep loop.
root        2191  2.4  0.0 217116   876 pts/2    S+   13:48   0:12 tail -f loop.log
root        2596 48.9  0.0 222524  1232 pts/0    T    13:56   0:04 bash loop.sh

# 修改脚本如下:
[root@localhost data]# cat loop.sh 
#!/bin/bash
i=0
while true;do
   echo "hello while." >> /data/loop.log
   let i=i+1
   if((i%9==0));then
      sleep 5
   fi
done
# 由于计算部分很快,然后就进入睡眠状态,查看如下:
[root@localhost data]# ps aux | grep loop
root        2931  0.0  0.0 222524  3096 pts/0    S+   14:07   0:00 bash loop.sh

说明IPC通信和RPC通信实现的方式

IPC(Inter-Process Communication)与RPC(Remote Procedure Call)用于实现跨进程通信。只不过IPC一般用于一台机器内部不同进程之间的通信,RPC用于不同机器间的进程调用通信。

IPC常见的是共享内存来通信,RPC是通过通信来调用远程机器上的函数或者方法。

IPC的实现方式:

1. 管道(Pipe)
管道是一种半双工的通信方式,只能在具有亲缘关系(如父子进程)的进程之间进行通信。管道是由操作系统内核创建的一段缓冲区,可以存放一定量的数据。数据写入管道后可以在另一个进程中被读取,管道的实现方式包括匿名管道和命名管道两种。
2. 消息队列(Message Queue)
消息队列是一种进程间的异步通信方式,它允许一个进程向另一个进程发送消息,消息包括类型和数据。消息队列可以在不同进程之间共享,接收者可以按照消息类型选择接收哪些消息。
3. 共享内存(Shared Memory)
共享内存是一种高效的进程间通信方式,它允许多个进程访问同一块内存区域,共享内存中的数据可以被所有进程访问和修改。共享内存的实现需要考虑同步和互斥问题,以保证数据的一致性。
4. 信号量(Semaphore)
信号量是一种计数器,用于进程间的同步和互斥。它允许多个进程对共享资源进行访问,但只允许一个进程访问资源的特定部分。信号量主要用于解决多进程之间的互斥问题。
5. 套接字(Socket)
套接字是一种通用的进程间通信方式,它可以用于不同机器和不同操作系统之间的通信。套接字通信可以在同一台计算机上的不同进程之间进行,也可以在不同计算机之间进行,是实现网络通信的基础。
6. 信号(Signal)
信号是一种异步通信方式,用于向进程发送通知。当操作系统检测到某个事件发生时,会向进程发送相应的信号,进程可以在信号处理函数中处理信号。信号通常用于进程间的事件通知和错误处理。

RPC的实现方式:

1. 基于HTTP协议的RPC
HTTP协议是一种广泛使用的应用层协议,它是基于TCP协议实现的,可以实现可靠的数据传输和通信。基于HTTP协议的RPC通常使用JSON或XML格式进行数据传输,客户端通过发送HTTP请求到服务器来调用远程方法,服务器返回响应结果。
2. 基于TCP/IP协议的RPC
TCP/IP协议是一种面向连接的协议,它可以实现可靠的数据传输和通信。基于TCP/IP协议的RPC通常使用二进制格式进行数据传输,客户端通过建立TCP连接到服务器来调用远程方法,服务器返回响应结果。
3. 基于UDP协议的RPC
UDP协议是一种无连接的协议,它可以实现高效的数据传输和通信,但不保证数据的可靠性和顺序性。基于UDP协议的RPC通常使用二进制格式进行数据传输,客户端通过发送UDP包到服务器来调用远程方法,服务器返回响应结果。
4. 基于序列化框架的RPC
序列化框架是一种将对象序列化为字节流的机制,可以实现对象的持久化和网络传输。基于序列化框架的RPC通常使用Java序列化或Protobuf等框架进行数据传输,客户端通过发送序列化后的数据到服务器来调用远程方法,服务器返回响应结果

通过mkfifo, cat, 来解释秒杀的并发问题,如何通过队列解决的?最好结合图形。说明消息队列的作用?

# 客户端,100个线程发送1万个消息到通道中
[root@localhost data]# cat client.sh 
#!/bin/bash

for i in {1..100};do
   (
      for j in {1..10000};do
         echo "$i=>$j" >> /data/task
      done
   )&
done
echo "all client are start..."
wait
echo "all client are done..."

# 服务器端,消息符合target的消息才会被获取
[root@localhost data]# cat server.sh 
#!/bin/bash

fifo=/data/task
target=$(($RANDOM%10000))
echo "$target is target."

while true;do
   cat /data/task | while read line
   do
      server=`echo $line | awk -F "=>" '{print $1}'`
      client=`echo $line | awk -F "=>" '{print $2}'`
      if [ "$client" -eq "$target" ];then
         echo "server is $server"
      fi
   done
done

# 结果
[root@localhost data]# bash  server.sh 
8024 is target.
server is 22
server is 26
server is 15
server is 85
server is 25
server is 83
server is 41
server is 5

如上所示,只有当消息队列中的消息满足条件的才会被获取并往后传递,在秒杀系统中,并不能把所有的读写往数据库上压,过于巨大的流量会瞬间压垮数据库,只有在前端限流,将流量过滤传递到数据库才能保障数据库的安全,上面的脚本中,一共有10万个消息传递到1个消息队列中,通过对消息队列的读取,过滤,限流,将中奖的消息往后传递,这样数据库压力几乎没有。

总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换

前台作业占据字符界面,只有当作业完成之后才能接收输入;后台作业在后台运行,不影响字符界面输入输出,并且后台界面使用nohup命令还可以在会话结束后继续执行;

使用ctrl+z可以将前台作业放入后台运行,也可以使用cmd &方式将命令放入后台执行;

但是使用ctrl+z后,命令在后台会停止,使用bg n将后台的n号命令在后台继续执行

使用fg n命令可以将后台的第n号命令放在前台执行

总结内核设计流派及特点

操作系统内核的设计流派主要分为两种:宏内核(Microkernel)和单内核(Monolithic Kernel)。
1.宏内核(Microkernel)
宏内核是一种将操作系统内核中的大部分功能模块化的设计方式,将操作系统内核分成多个组件或服务,仅保留最基本的内核服务,例如内存管理、进程管理、线程管理、IPC等。
其主要特点是:
- 将操作系统内核分成多个组件或服务,可以实现高度模块化的设计,方便添加、移除和修改功能。
- 在安全性和可靠性方面有一定的优势,因为每个组件只负责一个特定的功能,独立运行,出现问题时不会影响其他组件。
- 可以支持多种操作系统架构,例如分布式系统、实时系统等。
- 性能相对较低,因为需要经常进行进程间通信(IPC)。
2.单内核(Monolithic Kernel)
单内核是将所有操作系统内核服务集成在一个单独的大内核中,包括内存管理、进程管理、文件系统、网络协议栈等。
其主要特点是:
- 所有的内核服务都在一个单独的大内核中,可以实现高效的内部通信,提高系统性能。
- 简单、易于实现,因为所有的内核服务都在一个单独的大内核中,代码量相对较小,便于维护和修改。
- 可以提供更高的性能,因为不需要经常进行进程间通信(IPC)。
- 安全性和可靠性较差,因为所有的内核服务都在同一个进程中,出现问题时可能会导致整个系统崩溃。
总之,宏内核和单内核各有优劣,需要根据具体的需求和设计要求选择合适的设计流派。在实际的操作系统中,也有许多混合型的内核设计,如微内核(Hybrid Kernel)、外核(Exokernel)等。这些设计都是为了在保证高性能和高可用性的前提下,提高操作系统的可扩展性和灵活性。

总结centos 6 启动流程,grub工作流程

硬件启动流程
  打开电源
  进入bios,开始初始化硬件设备(POST),检查系统外围主要设备(cpu,内存,硬盘,显卡,io设备,键鼠)
  确认正常,启动设备,根据bios设备的启动顺序,检查驱动器(硬盘,光盘,U盘,网络)
  如果硬盘是启动项,读取硬盘第一个扇区(MBR)到内存
  注:MBR:512字节,前446bytes存储的是Boot Loader,64bytes存储分区表信息,2bytes(固定为55AA。如果这个标志位0xAA55则表示是正常的MBR)为分区标志位
bootloader阶段:
  bios读取MBR中的bootloader到内存中(地址是:0x7c00),并跳至该地址开始执行bootloader程序
  由于在MBR中的容量有限,所以大部分的bootloader都分为两部分,一部分存储在MBR中,一部分存储在MBR后面的存储中;
  启动过程中:
     第一步:前部分会的任务就是将控制权传递到后面的程序
     第二步:后部分会加载文件系统驱动,这样grub就可以访问/boot目录了
     第三步:从/boot/grub/grub.conf中加载内核以及其它模块,
  grub通过/boot/initrd文件建立虚拟根文件系统,这样就可以挂载根目录,最后转交内核
  加载内核文件/boot/vmlinux文件,但是内核没有磁盘驱动程序,需要借助Initrd文件的虚拟根文件系统来控制根目录
内核引导阶段:
  调用虚拟根目录中的init
  加载驱动模块初始化系统中的各个设备配置,包括CPU,I/O,存储设备,这些是内核能够识别并加载真实根目录的桥梁
  加载并切换真正的根文件系统
  协助内核呼叫/sbin/init程序
init初始化阶段:
  从/etc/inittab中获取用户启动级别
  初始化系统:/etc/rc.sysinit;初始化网络,打印欢迎信息,selinux,内存设备,接口设备测试,挂载文件系统,时间,raid,磁盘检查,配额等
  加载系统服务:/etc/rc.d/rcN.d,N代表是启动级别
  启动终端

手写chkconfig服务脚本,可以实现服务的开始,停止,重启。

# 编写一个脚本,永久循环输出,当作服务
[root@rhel615 ~]# cat /usr/local/bin/myapp.sh 
#!/bin/bash
conf=/etc/myapp.conf

content=`cat $conf`
echo $content >> /tmp/myapp.log
while true;do
   echo "$content=>`date +%F`" >> /tmp/myapp.log
   sleep 1
done

# 创建配置文件,用于服务使用
[root@rhel615 ~]# cat /etc/myapp.conf 
good day

# 创建chkconfig服务脚本
[root@rhel615 ~]# cat /etc/init.d/myapp 
#!/bin/bash
# source function library
. /etc/rc.d/init.d/functions
# chkconfig: 35 85 15
# description: This is a myapp Test Service.

conf=/etc/myapp.conf
shfile=/usr/local/bin/myapp.sh
pidfile=/tmp/myapp.pid
lockfile=/tmp/myapp.lock

# check config file exists
[ -f $conf ] || exit 1

# check sh file exists
[ -f $shfile ] || exit 2

start(){
   echo -n "Starting $shfile"
   $shfile &
   echo "$!" > $pidfile
   touch $lockfile
   echo  "success"
}
stop(){
   echo "Stop $shfile"
   kill `cat $pidfile` > /dev/null 2>&1 
   rm -f $lockfile > /dev/null 2>&1
   rm -f $pidfile > /dev/null 2>&1
   echo "success"
}
restart(){
   stop
   start
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac
exit 0

服务脚本主要是start,stop和restart三个函数

# 修改chkconfig权限
[root@rhel615 ~]# chmod +x /etc/init.d/myapp

# 使用service调用脚本
## 启动
[root@rhel615 ~]# service myapp start
Starting /usr/local/bin/myapp.shsuccess
[root@rhel615 ~]# cat /tmp/myapp.pid 
3248
[root@rhel615 ~]# ll /tmp/myapp.lock 
-rw-r--r--. 1 root root 0 Jun 15 17:08 /tmp/myapp.lock
## 停止
[root@rhel615 ~]# service myapp stop
Stop /usr/local/bin/myapp.sh
success
[root@rhel615 ~]# ll /tmp/myapp.lock 
ls: cannot access /tmp/myapp.lock: No such file or directory
[root@rhel615 ~]# cat /tmp/myapp.pid 
cat: /tmp/myapp.pid: No such file or directory

总结systemd服务配置文件

查看httpd的配置文件:

[root@localhost ~]# systemctl cat httpd
# /usr/lib/systemd/system/httpd.service
# See httpd.service(8) for more information on using the httpd service.

# Modifying this file in-place is not recommended, because changes
# will be overwritten during package upgrades.  To customize the
# behaviour, run "systemctl edit httpd" to create an override unit.

# For example, to pass additional options (such as -D definitions) to
# the httpd binary at startup, create an override unit (as is done by
# systemctl edit) and enter the following:

#       [Service]
#       Environment=OPTIONS=-DMY_DEFINE

[Unit]
Description=The Apache HTTP Server      //描述
Wants=httpd-init.service                //在此服务启动之后还需启动什么服务,之后的服务启动失败不影响本服务
After=network.target remote-fs.target nss-lookup.target httpd-init.service //在哪些服务之后启动
Documentation=man:httpd.service(8)      //如何查看文档

[Service]
Type=notify                             //启动结束后会发出通知信号,然后 Systemd 再启动其他服务,详情在下面
Environment=LANG=C                      //环境变量

ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND  //启动命令
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful  //重载配置文件命令
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed                                   //服务停止类型,默认control-group停止时杀死所有子进程,process只杀主进程,none只停止服务,不杀进程;
PrivateTmp=true                                  //如果把PrivateTmp的值设置成true ,服务启动时会在/tmp目录下生成类似systemd-private-433ef27ba3d46d8aac286aeb1390e1b-apache.service-RedVyu的文件夹,用于存放apache的临时文件。

[Install]
WantedBy=multi-user.target                        //在什么级别启动
Type字段定义启动类型。它可以设置的值如下。
	simple(默认值):ExecStart字段启动的进程为主进程
	forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
	oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
	dbus:类似于simple,但会等待 D-Bus 信号后启动
	notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
	idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合

 KillMode扩展:

 KillMode:定义 Systemd 如何停止 sshd 服务。它可以设置的值如下:
 -  control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
 -  process:只杀主进程
 -  mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
 -  none:没有进程会被杀掉,只是执行服务的 stop 命令


总结systemd启动流程

总结awk工作原理,awk命令,选项,示例

格式:

awk [option] 'program' [file]

program就是对文件进行操作的过程,其格式是:pattern{action statement;...} parttern是作为筛选行的语句,action表示对筛选出的行进行的操作

program语句中有两个特殊的pattern:BEGIN和END,BEGIN表示处理文本之前的操作,END表示处理文本之后的操作

# 示例
## 以冒号为分隔符,输出第一列;默认是以空格或tab为分隔符
[root@localhost ~]# awk -F ":" '{print $1}' /etc/passwd
root
bin
daemon
adm
...
## 在开头输入name字符串,在结尾输出END字符串
[root@localhost ~]# awk -F ":" 'BEGIN{print "name"}{print $1}END{print "END"}' /etc/passwd
name
root
bin
daemon
...
natasha
apache
END

## 输出存储使用率
[root@localhost ~]# df -h
文件系统             容量  已用  可用 已用% 挂载点
devtmpfs             1.8G     0  1.8G    0% /dev
tmpfs                1.8G     0  1.8G    0% /dev/shm
tmpfs                1.8G  9.3M  1.8G    1% /run
tmpfs                1.8G     0  1.8G    0% /sys/fs/cgroup
/dev/mapper/ao-root   64G   11G   54G   16% /
/dev/mapper/ao-home   32G  289M   31G    1% /home
/dev/nvme0n1p1      1014M  241M  774M   24% /boot
tmpfs                369M     0  369M    0% /run/user/0
[root@localhost ~]# df -h | awk -F "[ %]+" '{print $5}'
已用
0
0
1
0
16
1
24
0

## 提取部分文本
[root@localhost ~]# cat test.log 
1 www.mageedu.com
2 blog.mageedu.com
3 study.mageedu.com
4 linux.mageedu.com
5 python.mageedu.com
[root@localhost ~]# awk -F "[ .]+" '{print $2}' test.log 
www
blog
study
linux
python

# 格式化输出
格式:printf "FORMAT",item1,item2,....
##左对齐
[root@localhost ~]# awk -F "[ .]+" '{printf "%-5s\n",$2}' test.log 
www  
blog 
study
linux
python
## 右对齐
[root@localhost ~]# awk -F "[ .]+" '{printf "%5s\n",$2}' test.log 
  www
 blog
study
linux
python
## 输出多列并对齐
[root@localhost ~]# awk -F":" '{printf "%-20s%20s\n",$1,$7}' /etc/passwd
root                           /bin/bash
bin                        /sbin/nologin
daemon                     /sbin/nologin
adm                        /sbin/nologin
lp                         /sbin/nologin

总结awk的数组,函数

# 声明数组并输出
[root@localhost ~]# awk 'BEGIN{a["x"]="welcome";a["y"]="to";a["z"]="chengdu";for(i in a){print i,a[i]}}'
x welcome
y to
z chengdu
# 声明了一个字典line,$0是本行的内容;line[$0]默认是空,为假,取反就是真,然后再++值加1,所以第一次打印,第二次出现的时候,line[$0]为真,取反为假,就不打印,但还是值加1;所以只显示所有的行一次,重复的就不打印了。
[root@localhost ~]# awk '$line[$0]' test.log
# 打印文本中所有行,去除重复的行
[root@localhost ~]# awk '{!line[$0]++}END{for(i in line)print i,line[i]}' test.log

awk自带的函数,分数字型函数,字符串型函数等等

常见函数:

rand() 返回0-1的随机数字;注意并不是真随机,是假随机

srand() ;配合rand函数使用,生成随机数种子

# 输出随机数
## 伪随机
[root@localhost ~]# awk 'BEGIN{print rand()}'
0.924046
[root@localhost ~]# awk 'BEGIN{print rand()}'
0.924046

## 稍微靠谱的随机
[root@localhost ~]# awk 'BEGIN{srand();print rand()}'
0.534041
[root@localhost ~]# awk 'BEGIN{srand();print rand()}'
0.338302
[root@localhost ~]# awk 'BEGIN{srand();print rand()}'
0.116647
## 输出0-100的随机数
[root@localhost ~]# awk 'BEGIN{srand();print int(rand()*100)}'
77
## 输出字符串长度
[root@localhost ~]# awk 'BEGIN{print length("11111111111")}'
11
[root@localhost ~]# awk 'BEGIN{print length("111111111111")}'
12
## 输出passwd文件每行的长度
[root@localhost ~]# awk '{print length($0)}' /etc/passwd
31
32
39
36
40

总结openssh免密认证原理,及免认证实现过程

posted @   NewBird001  阅读(163)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示