9.4-6 kill & killall & pkill
kill:终止进程
能够终止你希望停止的进程。
kill 命令的参数选项及说明
-l 列出全部的信号名称
-p 指定kill命令只打印相关进程的进程号,而不发送任何信号
-s 指定要发送的信号
[root@k8s-play ~]# kill -l #<=参数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 [root@k8s-play ~]# kill -l SIGKILL #<=可以使用-l参数对信号名和数字信号互换。 9 [root@k8s-play ~]# kill -l 9 KILL
常用信号
信号 说明
HUP(1) 挂起,通常因终端掉线或用户退出而引发
INT(2) 中断,通常是按下Ctrl+c组合健来发出这个信号
QUIT(3) 退出,通常是按下Ctrl+\组合键来发出这个信号
KILL(9) 立即结束进程的运行
TERM(15) 终止,通常在系统关机时发送
TSTP(20) 暂停进程的运行,通常是按下Ctrl+z组合键来发出这个信号
更多细节请参考signal在线手册的第七部分(man 7signal)。
终止进程
kill指令默认使用的信号为15,用于结束进程。如果进程忽略此信号,则可以使用信号9强制终止进程。
一般是先通过ps等命令获取到要终止进程的进程号,然后直接使用“kill 进程号”就可以了。
kill 2203 #<==Kill命令默认使用的信号为15,这种格式也是最常用的。
kill -s 15 2203 #<==这种格式使用-s参数明确指定发送值为15的信号,效果和 kill 2203 一样。
kill -15 2203 #<==上面的-s 15可以简写为 -15
如果用上面的方法还是无法终止进程,那么我们就可以用KILL(9)信号强制终止进程。
kill -9 2203 #<==信号9会强行终止进程,这会带未一些副作用、如教据丢失,或者终端无法恢复到正常扶态等,因此应尽量避免使用,除非进程使用其他信号无法终止。
扩展:特殊信号0的应用案例
在kill的所有信号中,有一个十分特殊的信号值0,使用格式为kill -0 $pid。其中的 -0 表示不发送任何信号给$pid对应的进程,但是仍然会对$pid是否存在对应的进程进行检查,如果$pid对应的进程已存在,则返回0,若不存在则返回1。下面是系统参考脚本 /etc/init.d/mysqld。
killall:通过进程名终止进程
使用kill命令终止进程还需要先获取进程的pid进程号,这个过程有点繁琐,而使用killall命令就可以直接用“killall 进程名”这种形式终止进程。
killall [选项] [进程名]
-c 对于很长的名字,要求能够准确匹配。默认情况下,如果一个进程名的长度超过了15个字符,则无法使用整个名字(溢出了)。在这种情况下,killall会终止所有匹配名字前15个字符的所有进程。而-e参数的作用是忽略模糊匹配项目。如果同时指定了-v选项,则killall会针对每个忽略的记录打印一条消息
-I 不区分大小写匹配
-g 终止属于该进程组的进程
-i 在终止进程之前询问是否确认
-l 列出所有已知的信号名
-q 如果没有进程终止则不提示
-r 使用正则表达式匹配要终止的进程名称
-s 用指定的信号代替默认信号
-u 终止指定用户的进程
-v 报告信号是否发送成功
-w 等待所有被终止的进程死去。killall每秒都会检查一次被终止的进程是否仍然存在,其仅在都死光后才返回。注意,如果信号被忽略,或者没有起作用,或者进程停留在僵尸状态,那么killall可能会永久等待
[root@cs6 ~]# killall crond [root@cs6 ~]# killall crond crond: 没有进程被杀死 [root@cs6 ~]# /etc/init.d/crond start 正在启动 crond: [确定] [root@cs6 ~]# killall -w crond [root@cs6 ~]# killall -w crond crond: 没有进程被杀死
终止指定用户的所有进程
killall -u www nginx #<=这种方式可以终正所有归属于www用户的nginx进程
pkill:通过进程名终止进程
pkil命令可通过进程名终止指定的进程。使用killal终止进程需要连续执行几次,而pkill 可以杀死指定进程及其所有子进程。
pkill [选项] [进程名]
-t 终端 杀死指定终端的进程
-u 用户 杀死指定用户的进程
通过进程名终止进程
[root@cs6 ~]# service crond status crond (pid 4641) 正在运行... [root@cs6 ~]# pkill crond [root@cs6 ~]# service crond status crond 已死,但是 subsys 被锁
通过终端名终止进程
[root@cs6 ~]# w 07:20:39 up 1 day, 22:40, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/4 10.0.0.1 00:59 0.00s 0.53s 0.00s w [root@cs6 ~]# pkill -t tty4
通过用户名终止进程
[root@cs6 ~]# w 07:22:39 up 1 day, 22:42, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.0.0.1 07:21 1:34 0.07s 0.07s -bash root pts/4 10.0.0.1 00:59 0.00s 0.54s 0.00s w [root@cs6 ~]# pkill -u root Connection closing...Socket close. Connection closed by foreign host. Disconnected from remote host(cs6-minimal) at 15:24:31. #<=使用 -u 选项杀死指定用户的所有进程,最好还是同时再指定进程名去杀,以免误杀服务。