kill

kill - terminate a process

发送指定的信号到相应进程。不指定信号将发送SIGTERM(15)终止指定进程。若仍无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。

格式:
kill [option] pid

常用参数:

  • -l:打印信号名称列表,或将给定的信号作为参数转换为名称。
  • -s:指定要发送出的信号
  • -u user:指定用户

**列出所有信号名称:** ``` [root@node1 ~]# 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

示例:

[root@node1 ~]# kill -l 15  #将给定的15信号转换成名称
TERM
[root@node1 ~]# kill -l TERM
15


[root@node1 ~]# 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
[root@node1 ~]# kill 10698   #结束mongod进程
[root@node1 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

示例:

[root@node1 ~]# vim b.sh
#!/bin/sh

trap 'echo yes' SIGINT     #捕捉INT信号,并输出yes
trap 'echo today' SIGTERM  #捕捉TERM信号,并输出today
for((;;)) do
    sleep 1
    echo "no"
done


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


**总结:** `kill`命令`KILL|9`信号只有进程无法正常关闭时,才能使用。`HUP|1`用来重读配置文件。`ctrl+c`是信号`INT|2`
原文地址:https://www.cnblogs.com/dance-walter/p/10308070.html