分类: LINUX
2015-07-08 13:03:37
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。
1.命令格式:
kill [-s signal|-p] [--] pid...
kill -l [signal]
[root@RHEL6 ~]# kill -l KILL #加上信号名称会显示信号编码 9 [root@RHEL6 ~]# kill -l 9 #加上信号的编码会显示信号编码的名称 KILL [root@RHEL6 ~]# 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@RHEL6 ~]# |
kill -signal %jobnumber
kill -9 %2 #-9表示强制删除一个jobnumber为2的工作; |
kill -signal pid
kill 1756 #不指定信号将发送SIGTERM(15)终止指定的1756进程 kill -9 1756 #-9表示强制删除一个PID为1756的工作 kill -SIGTERM %1 #signal除了以数值来表示外,也可以使用信号名称,信号名称可以使用kill –l查询 |
2.命令功能:
发送指定的信号到相应进程。不指定信号将发送SIGTERM(15)终止指定进程。如果仍无法终止该程序可用"-KILL" 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。
3.命令参数:
-l 信号,若果不加信号的编号参数(加上信号的编码会显示信号编码的名称),则使用"-l"参数会列出全部的信号名称
-a 当处理当前进程时,不限制命令名和进程号的对应关系
-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s 指定发送信号
-u 指定用户
signal:代表给予后面接的那个进程什么样的指示,用man 7 signal 可知
-1:重新读取一次参数的配置文件(类似service xxx reload)
-2:代表与由键盘输入ctrl+c同样的操作;
-9:立刻强制删除一个进程;
-15:以正常的程序方式终止一项工作
注意:
1、kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。例如:
kill -2 123
它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号。
2、kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。
3、可以向多个进程发信号或终止它们。
4、当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来。
5、应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。
6、kill后面接的数字默认会是PID,如果想要管理bash的工作控制(jobs control),就得要加上%数字了,这点千万注意
4.signal说明:
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。下面是常用的信号(用man 7 signal 可知详细说明):
代号 |
名称 |
内容 |
1 |
SIGHUP |
启动被终止的进程,可让该PID重新读取自己的配置文件,类似reload |
2 |
SIGINT |
相当于用键盘输入ctrl+c来中断一个进程的进行 |
9 |
SIGKILL |
强制中断一个进程的进行,如果该进程进行到一半,那么尚未完成的部分可能会后半产品产生,类似vim会有.filename.swp保留下来 |
15 |
SIGTERM |
以正常的结束进程来终止该进程。由于是正常的终止,所以后续的操作会将它完成。不过,如果该进程已经放生问题,就是无法使用正常的方法终止时,输入这个signal也是没有用的 |
18 |
SIGCONT |
继续与STOP正好相反,类似bg命令 |
19 |
SIGSTOP |
相当于用键盘输入ctrl+z来暂停一个进程的运行 |
Signal Value Action Comment ---------------------------------------------------------------------- SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling process SIGINT 2 Term Interrupt from keyboard SIGQUIT 3 Core Quit from keyboard SIGILL 4 Core Illegal Instruction SIGABRT 6 Core Abort signal from abort(3) SIGFPE 8 Core Floating point exception SIGKILL 9 Term Kill signal SIGSEGV 11 Core Invalid memory reference SIGPIPE 13 Term Broken pipe: write to pipe with no readers SIGALRM 14 Term Timer signal from alarm(2) SIGTERM 15 Term Termination signal SIGUSR1 30,10,16 Term User-defined signal 1 SIGUSR2 31,12,17 Term User-defined signal 2 SIGCHLD 20,17,18 Ign Child stopped or terminated SIGCONT 19,18,25 Cont Continue if stopped SIGSTOP 17,19,23 Stop Stop process SIGTSTP 18,20,24 Stop Stop typed at tty SIGTTIN 21,21,26 Stop tty input for background process SIGTTOU 22,22,27 Stop tty output for background process |
实例1:找出rsyslog这个进程的PID,在用kill传送信号,使得rsyslog可以重新读取配置文件
找出syslog的PID可以这样做 [root@RHEL6 ~]# ps aux | grep 'syslog' | grep -v 'grep' | awk '{print $2}' 1365 由于需要重新读取配置文件,因此signal是1号,信号名称也就是SIGHUP [root@RHEL6 ~]# kill -SIGHUP $(ps aux | grep 'syslog' | grep -v 'grep' | awk '{print $2}') 如果要确认有没有重新启动rsyslog,可以参考日志文件的内容,使用如下命令 [root@RHEL6 ~]# tail -1 /var/log/messages Jul 8 14:16:27 RHEL6 rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1365" x-info="] rsyslogd was HUPed [root@RHEL6 ~]# |