『学了就忘』Linux系统管理 — 84、Linux中进程的管理
阅读原文时间:2021年12月17日阅读:2

目录

Linux系统中可以识别的信号较多,我们可以使用命令kil1 -1man 7 signal来查询,

命令如下:

[root@localhost ~]# kill -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

我们介绍一下常用的主要的信号:

信号代号

信号名称

说明

1

SIGHUP

该信号让进程立即关闭,然后重新读取配置文件之后重启。

2

SIGINT

程序终止信号,用于终止前台进程。相当于输出ctrl+c快捷键。

8

SIGFPE

在发生致命的算术运算错误时发出,不仅包括浮点运算错误,还包括溢出及除数为0等其它所有的算术的错误。

9

SIGKILL

用来立即结束程序的运行,本信号不能被阻塞、处理和忽略。一般用于强制终止进程。

14

SIGALRM

时钟定时信号,计算的是实际的时间或时钟时间。alarm函数用该信号。

15

SIGTERM

正常结束进程的信号,kill命令的默认信号。有时如果进程已经发生问题,这个信号是无法正常终止进程的,我们才会尝试SIGKILL信号,也就是信号9。

18

SIGCONT

该信号可以让暂停的进程恢复执行,本信号不能被阻断。

19

SIGSTOP

该信号可以暂停前台进程,相当于输入ctrl+z快捷键。本信号不能被阻断。

提示:这其中最常用的是1和9,请记住。

(1)kill命令

kill命令后边只能跟进程的id号,不能跟进程名称。

[root@localhost ~]# kill [信号] PID

例1:使用-1信号,让进程重启。

# 使用“-1(数字一)”信号,让httpd的主进程重启动。
[root@localhost ~]#  kill -1 2345

例2:使用-9信号,让结束一个进程。

# 使用“-9”信号,让xinetd的进程结束运行。
[root@localhost ~]#  kill -9 5678

(2)killall命令

killall命令一般用于杀掉一类进程。

[root@localhost ~]# killall [选项] [信号] 进程名

选项:
  -i:交互式,询问是否要杀死某个进程。
  -I:忽略进程名的大小写。

注意:killall命令要写进程名,不要写进程id

示例:

# 查询系统有3个sshd进程。1735是sshd服务的进程,5470和5883是我的两个远程连接的进程。
[root@localhost ~]# ps aux | grep "sshd"
root       1735  0.0  0.0  66236  1204 ?        Ss   08:42   0:00 /usr/sbin/sshd
root       5470  0.0  0.2 102084  4148 ?        Ss   20:41   0:00 sshd: root@pts/2
root       5883  0.0  0.2 102084  4140 ?        Ss   22:09   0:00 sshd: root@pts/0
root       6088  0.0  0.0 103332   852 pts/0    S+   22:28   0:00 grep sshd

# 过滤一下
[root@localhost ~]# ps aux | grep "sshd" | grep -v "grep"
root       1735  0.0  0.0  66236  1204 ?        Ss   08:42   0:00 /usr/sbin/sshd
root       5470  0.0  0.2 102084  4148 ?        Ss   20:41   0:00 sshd: root@pts/2
root       5883  0.0  0.2 102084  4140 ?        Ss   22:09   0:00 sshd: root@pts/0 

# 交互式杀死sshd进程
[root@localhost ~]# killall -i sshd
# 这个进程是sshd的服务进程,如果杀死,所有的sshd连接都不能登录。
杀死sshd(1735)?(y/N)n
# 这是我当前登录终端,不能杀死我自己吧!
杀死sshd(5470)?(y/N)n
# 可以把另外一个sshd登录终端踢出。
杀死sshd(5883)?(y/N)y

(3)pkill命令

pkill命令和killall命令非常类似,也是按照进程名来杀死进程。

格式如下:

[root@localhost ~]# pkill [选项] [信号] 进程名

选项:
  -t终端号:按照终端号踢出用户。

示例:

# 查看当前Linux系统中登陆的终端
# 注意WHAT为w的就代表是当前终端,也就是我自己。
[root@localhost ~]# w
 22:16:25 up 13:34,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     -                22:16    6.00s  0.04s  0.04s -bash
root     pts/0    192.168.134.1    22:09    0.00s  0.17s  0.08s w
root     pts/2    192.168.134.1    20:41   56:31   0.19s  0.19s -bash

# 提出终端号为pts/2的用户
# 注意-9一定要放在-t前,否则命令不能执行成功。
[root@localhost ~]# pkill -9 -t pts/2

# 再看当前Linux系统中登陆的终端
[root@localhost ~]# w
 22:18:36 up 13:36,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     -                22:16    2:17   0.04s  0.04s -bash
root     pts/0    192.168.134.1    22:09    0.00s  0.10s  0.01s w