kill
Posted dance-walter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kill相关的知识,希望对你有一定的参考价值。
kill - terminate a process
发送指定的信号到相应进程。不指定信号将发送SIGTERM(15)终止指定进程。若仍无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。
格式:
kill [option] pid
常用参数:
- -l:打印信号名称列表,或将给定的信号作为参数转换为名称。
- -s:指定要发送出的信号
- -u user:指定用户
列出所有信号名称:
[[email protected] ~]# 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 | 终端断线,可以让该进程重新重读配置文件。类似重新启动,ExecReload=/bin/kill -s HUP $PID |
2 | SIGINT | 中断程序,相当于ctrl+c |
3 | SIGQUIT | 退出程序,相当于ctrl+,ExecStop=/bin/kill -s QUIT $PID |
9 | SIGKILL | 强制终止,代表强制中断一个程序的进行,效果和vim非正常退出一样。 |
15 | SIGTERM | 正常退出,以正常的方式来终止该程序。由于是正常的终止,所以后续的动作会将他完成。 |
18 | SIGCONT | 继续(与SIGSTOP相反,fg/bg命令) |
19 | SIGSTOP | 暂停,相当于ctrl+Z |
示例:
[[email protected] ~]# kill -l 15 #将给定的15信号转换成名称
TERM
[[email protected] ~]# kill -l TERM
15
[[email protected] ~]# ps -ef | grep mongod
root 9731 4807 0 21:40 pts/1 00:00:00 tail -f /var/log/mongodb/mongod.log
mongod 10698 1 24 21:58 ? 00:00:03 /usr/bin/mongod -f /etc/mongod.conf
root 10762 5786 0 21:58 pts/2 00:00:00 grep --color=auto mongod
[[email protected] ~]# kill 10698 #结束mongod进程
[[email protected] mongodb]# tail -f /var/log/mongodb/mongod.log #查看日志,日志能够收到信号为15的信号,因为此测试进程为非忙碌状态,所以直接关闭了。如果直接使用kill -9日志就收不到日志,会直接把进程给杀掉了。
...
2019-01-22T21:58:42.783-0500 I CONTROL [signalProcessingThread] got signal 15 (Terminated), will terminate after current cmd ends
2019-01-22T21:58:42.784-0500 I NETWORK [signalProcessingThread] shutdown: going to close listening sockets...
2019-01-22T21:58:42.784-0500 I NETWORK [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock
2019-01-22T21:58:42.784-0500 I CONTROL [signalProcessingThread] Shutting down free monitoring
2019-01-22T21:58:42.785-0500 I FTDC [signalProcessingThread] Shutting down full-time diagnostic data capture
2019-01-22T21:58:42.787-0500 I STORAGE [signalProcessingThread] WiredTigerKVEngine shutting down
2019-01-22T21:58:42.876-0500 I STORAGE [signalProcessingThread] shutdown: removing fs lock...
2019-01-22T21:58:42.877-0500 I CONTROL [signalProcessingThread] now exiting
2019-01-22T21:58:42.877-0500 I CONTROL [signalProcessingThread] shutting down with code:0
陷阱trap
:
shell脚本中使用trap
用来获取signal信号的工具。KILL和STOP这两个信号无法被捕捉。一般来说,在设置信号陷阱时,只会考虑HUP、INT、QUIT、TERM这4个会终止、中断进程的信号。
格式:
trap ‘command|function‘ signal_list
示例:
[[email protected] ~]# vim b.sh
#!/bin/sh
trap ‘echo yes‘ SIGINT #捕捉INT信号,并输出yes
trap ‘echo today‘ SIGTERM #捕捉TERM信号,并输出today
for((;;)) do
sleep 1
echo "no"
done
[[email protected] ~]# bash b.sh #执行的过程
^Cyes #按下ctrl+c,输出了yes,因为shell脚本捕获了中断进程并输出yes,所以中断信号就此消失,并继续执行后续命令
no
no
no
no
no
no
no
today #重开一个会话,并获取执行此脚本的进程pid号,并使用 kill pid,终止进程,脚本捕捉到信号后输出today
no
...
Killed #kill -9 pid
[[email protected] ~]#
总结:
kill
命令KILL|9
信号只有进程无法正常关闭时,才能使用。HUP|1
用来重读配置文件。ctrl+c
是信号INT|2
以上是关于kill的主要内容,如果未能解决你的问题,请参考以下文章