Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313484
  • 博文数量: 84
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 890
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 16:46
文章分类

全部博文(84)

文章存档

2017年(2)

2016年(4)

2015年(78)

我的朋友

分类: 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 ~]#




 

阅读(1460) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~