Day-22进程管理(2)

1.kill

①使用kill -l 查看当前系统所支持的信号

[root@wxb ~]# kill -l
1) SIGHUP       终端的控制进程结束,通知session内的各个作业,脱离关系 
2) SIGINT       程序终止信号(Ctrl+c)
3) SIGQUIT      和2号信号类似(Ctrl+\),产生core文件
4) SIGILL       执行了非法指令,可执行文件本身出现错误 
5) SIGTRAP      有断点指令或其他trap指令产生,有debugger使用
6) SIGABRT      调用abort函数生成的信号 
7) SIGBUS       非法地址(内存地址对齐出错)
8) SIGFPE       致命的算术错误(浮点数运算,溢出,及除数为0 错误)
9) SIGKILL      用来立即结束程序的运行
10) SIGUSR1     用户使用 
11) SIGSEGV     访问内存错误
12) SIGUSR2     用户使用
13) SIGPIPE     管道破裂
14) SIGALRM     时钟定时信号
15) SIGTERM     程序结束信号(可被阻塞,处理)
16) SIGSTKFLT   协处理器栈堆错误
17) SIGCHLD     子进程结束,父进程收到这个信号并进行处理,(wait也可以)否则僵尸进程
18) SIGCONT     让一个停止的进程继续执行(不能被阻塞)
19) SIGSTOP     让一个进程停止执行(不能被阻塞,处理,忽略)
20) SIGTSTP     停止进程的运行(可以被处理和忽略)
21) SIGTTIN     当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.
22) SIGTTOU     类似SIGTTIN,但在写终端时收到
23) SIGURG      有紧急数据或者out—of—band 数据到达socket时产生
24) SIGXCPU     超过CPU资源限定,这个限定可改变
25) SIGXFSZ     当进程企图扩大文件以至于超过文件大小资源限制
26) SIGVTALRM   虚拟时钟信号(计算的是该进程占用的CPU时间)
27) SIGPROF     时钟信号(进程用的CPU时间及系统调用时间)
28) SIGWINCH    窗口大小改变时发出
29) SIGIO       文件描述符准备就绪,可以进行读写操作
30) SIGPWR      power failure
31) SIGSYS      非法的系统调用
[root@wxb ~]# systemctl start vsftpd
[root@wxb ~]# ps aux|grep vsftpd
root       7810  0.0  0.0  53176   580 ?        Ss   14:57   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root       7812  0.0  0.0 112708   976 pts/0    R+   14:58   0:00 grep --color=auto vsftpd
1)发送重载信号,例如 vsftpd 的配置文件发生改变,希望重新加载
[root@wxb ~]# kill -1  7810
[root@wxb ~]# ps aux|grep vsftpd
root       7810  0.0  0.0  53176   760 ?        Ss   14:57   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root       7814  0.0  0.0 112708   972 pts/0    R+   14:59   0:00 grep --color=auto vsftpd
2)发送停止信号,当然vsftpd 服务有停止的脚本(sytemctl stop vsftpd)
[root@wxb ~]# kill  7810
[root@wxb ~]# ps aux|grep vsftpd
root       7818  0.0  0.0 112708   976 pts/0    R+   15:00   0:00 grep --color=auto vsftpd
3)重启后发送强制停止信号
[root@wxb ~]# systemctl start vsftpd
[root@wxb ~]# ps aux|grep vsftpd
root       7826  0.0  0.0  53176   580 ?        Ss   15:00   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root       7828  0.0  0.0 112708   976 pts/0    R+   15:00   0:00 grep --color=auto vsftpd
[root@wxb ~]# kill -9  7826
[root@wxb ~]# ps aux|grep vsftpd
root       7843  0.0  0.0 112708   976 pts/0    R+   15:01   0:00 grep --color=auto vsftpd

②.Linux系统中的killall、pkill命令用于杀死指定名字的进程。我们可以使用kill命令杀死指定进程PID的进程时我们还需要在之前使用ps等命令再配合grep来查找进程,而killall、pkill无需查找

1)用名称
[root@wxb ~]# systemctl start nginx
[root@wxb ~]# ps aux|grep nginx
root       7854  0.0  0.0  46340   968 ?        Ss   15:14   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx      7855  0.0  0.0  46748  1932 ?        S    15:14   0:00 nginx: worker process
root       7857  0.0  0.0 112708   976 pts/0    R+   15:15   0:00 grep --color=auto nginx
[root@wxb ~]# pkill nginx
[root@wxb ~]# ps aux|grep nginx
root       7862  0.0  0.0 112708   976 pts/0    R+   15:15   0:00 grep --color=auto nginx
[root@wxb ~]# killall nginx
[root@wxb ~]# ps aux|grep nginx
root       7862  0.0  0.0 112708   976 pts/0    R+   15:15   0:00 grep --color=auto nginx
2)用终端
[root@wxb ~]# pkill -9 -t pts/0

2.管理后台进程

1).什么是后台进程
通常进程都会在终端前台运行,一旦关闭终端,进程也会随着结束,那么此时我们就希望进程能在后台运行,就是将在前台运行的进程放入后台运行,这样及时我们关闭了终端也不影响进程的正常运行。
2).我们为什么要将进程放入后台运行
比如:我们此前在国内服务器往国外服务器传输大文件时,由于网络的问题需要传输很久,如果在传输的过程中出现网络抖动或者不小心关闭了终端则会导致传输失败,如果能将传输的进程放入后台,是不是就能解决此类问题了。
3).screen

①安装
[root@wxb ~]# yum install screen -y
②打开一个指定的特殊窗口
[root@wxb ~]# screen -S wget_mysql
[root@wxb ~]# wget https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso
使用CTRL+ad退出窗口
③查看后台运行程序
[root@wxb ~]# screen  -list
There is a screen on:
    7895.wget_mysql (Detached)
1 Socket in /var/run/screen/S-root.
④将后台运行程序调至前台
[root@wxb ~]# screen -r wget_mysql
⑤结束后台运行程序
ctrl+c---->exit
ctrl+c---->ctrl+d

3.进程优先级

  • nice 值越高: 表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
  • nice 值越低: 表示优先级越高,例如-20,该进程更不倾向于让出CPU。
    nice修改程序优先级
①使用top可以查看nice优先级。  NI: 实际nice级别,默认是0。 PR: 显示nice值,-20映射到0,+19映射到39
②使用ps查看进程优先级
[root@wxb ~]# ps axo command,nice |grep sshd|grep -v 
③如何设置进程优先级
[root@wxb ~]# nice -n -5 vim
[1] 98417
[root@wxb ~]# ps axo pid,command,nice |grep 98417
 98417 vim                         -5

renice修改正在运行的进程优先级

①查看sshd进程当前的优先级状态
[root@wxb ~]# ps axo pid,command,nice |grep shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D             0
 ②.调整sshd主进程的优先级
[root@wxb ~]# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20
③.调整之后记得退出终端
[root@wxb ~]# ps axo pid,command,nice |grep shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D           -20
[root@wxb ~]# exit
④.当再次登陆sshd服务,会由主进程fork子进程(那么子进程会继承主进程的优先级)
[root@wxb ~]# ps axo pid,command,nice |grep shd
 98002 /usr/sbin/sshd -D           -20
 98122 sshd: root@pts/0            -20

4.平均负载

场景一:CPU 密集型进程

1.首先,我们在第一个终端运行 stress 命令,模拟一个 CPU 使用率 100% 的场景:
[root@wxb ~]# stress --cpu 1 --timeout 600
2.接着,在第二个终端运行 uptime 查看平均负载的变化情况使用watch -d 参数表示高亮显示变化的区域(注意负载会持续升高)
[root@wxb ~]# watch -d uptime
17:27:44 up 2 days,  3:11,  3 users,  load average: 1.10, 0.30, 0.17
3.最后,在第三个终端运行 mpstat 查看 CPU 使用率的变化情况
-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
[root@wxb ~]# mpstat -P ALL 5
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_    (1 CPU)
17时32分03秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17时32分08秒  all   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17时32分08秒    0   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
单核CPU所以只有一个all和0
4.从终端二中可以看到,1 分钟的平均负载会慢慢增加到1.00,而从终端三中还可以看到正好有一个 CPU 
的使用率100%,但它的 iowait 只有 0。这说明,平均负载的升高正是由于 CPU 使用率为 100% 。
那么,到底是哪个进程导致了 CPU 使用率为 100% 呢?可以使用 pidstat 来查询
间隔 5 秒后输出一组数据
[root@wxb ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_(1 CPU)
17时33分21秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
17时33分26秒     0    110019   98.80    0.00    0.00   98.80     0  stress
从这里可以明显看到,stress 进程的 CPU 使用率为 100%。

场景二:I/O 密集型进程

1.首先还是运行 stress 命令,但这次模拟 I/O 压力,即不停地执行 sync
[root@wxb ~]# stress  --io 1 --timeout 600s
2.然后在第二个终端运行 uptime 查看平均负载的变化情况:
[root@wxb ~]# watch -d uptime
18:43:51 up 2 days,  4:27,  3 users,  load average: 1.12, 0.65, 0.00
3.最后第三个终端运行 mpstat 查看 CPU 使用率的变化情况:
显示所有 CPU 的指标,并在间隔 5 秒输出一组数据
[root@wxb ~]# mpstat -P ALL 5
Linux 3.10.0-693.2.2.el7.x86_64 (bgx.com)   2019年05月07日     _x86_64_    (1 CPU)
14时20分07秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
14时20分12秒  all    0.20    0.00   82.45   17.35    0.00    0.00    0.00    0.00    0.00    0.00
14时20分12秒    0    0.20    0.00   82.45   17.35    0.00    0.00    0.00    0.00    0.00    0.00
会发现cpu的与内核打交道的sys占用非常高
4.那么到底是哪个进程,导致 iowait 这么高呢?我们还是用 pidstat 来查询
间隔 5 秒后输出一组数据,-u 表示 CPU 指标
[root@wxb ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_(1 CPU)
18时29分37秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
18时29分42秒     0    127259   32.60    0.20    0.00   67.20   32.80     0  stress
18时29分42秒     0    127261    4.60   28.20    0.00   67.20   32.80     0  stress
18时29分42秒     0    127262    4.20   28.60    0.00   67.20   32.80     0  stress
可以发现,还是 stress 进程导致的。

场景三:大量进程的场景
当系统中运行进程超出 CPU 运行能力时,就会出现等待 CPU 的进程。

1.首先,我们还是使用 stress,但这次模拟的是 4 个进程
[root@wxb ~]# stress -c 4 --timeout 600
2.由于系统只有 1 个 CPU,明显比 4 个进程要少得多,因而,系统的 CPU 处于严重过载状态
[root@wxb ~]# watch -d uptime
19:11:07 up 2 days,  4:45,  3 users,  load average: 4.65, 2.65, 4.65
3.然后,再运行 pidstat 来看一下进程的情况:
间隔 5 秒后输出一组数据
[root@wxb ~]# pidstat -u 5 1
平均时间:   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
平均时间:     0    130290   24.55    0.00    0.00   75.25   24.55     -  stress
平均时间:     0    130291   24.95    0.00    0.00   75.25   24.95     -  stress
平均时间:     0    130292   24.95    0.00    0.00   75.25   24.95     -  stress
平均时间:     0    130293   24.75    0.00    0.00   74.65   24.75     -  stress
可以看出,4 个进程在争抢 1 个 CPU,每个进程等待 CPU 的时间(也就是代码块中的 %wait 列)高达 75%。
这些超出 CPU 计算能力的进程,最终导致 CPU 过载。

你可能感兴趣的:(Day-22进程管理(2))