红联Linux门户
Linux帮助

RHEL6系统进程管理之四进程管理kill命令

发布时间:2014-08-16 10:45:53来源:linux网站作者:linux

我们就来看看RHEL6系统进程的管理了。
我们知道,一般程序本身都会带自身的管理程序,如关闭、重新启动。除了自带的,我们也可以通过发信号的方式来告诉程序需要做什么,这就是下面我们要介绍的内容。


先来了解一下几个常用的信号

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

系统中有这么多的信号,我们不用管他,只要来了解几个常用的就OK了,如果想仔细的研究的朋友,请到网上找相应的内容,或者是查看signal的帮助(man 7 signal 如果没有此命令,请安装man-pages软件包)。


1 SIGHUP 启动被终止的程序,可让该 PID 重新读取自己的配置文件,类似重新启动

2 SIGINT 相当于用键盘输入 ctrl+c 来中断一个程序

9 SIGKILL 代表强制停止一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有『半产品』产生,类似 vim会有 .filename.swp 保留下来

15 SIGTERM 以正常的结束程序来终止该程序。由于是正常的终止,所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。

17 SIGSTOP 相当于用键盘输入 ctrl+z 来暂停一个程序

上面的数字是信号代码,而SIG*就是信号,这两个是等同的哦。


进程管理命令kill,killall,pkill,xkill详解
那么我们如何传送一个信号给某个进程呢?就要通过 kill 、killall、pkill、xkill了。下面就来看看他们是如何使用的。

kill的应用是和ps 或pgrep 命令结合在一起使用的;

kill 的用法:

kill [信号][信号代码]  进程ID

注意:信号或信号代码只要用一个就OK了。


[root@yufei ~]# ps auxf |grep httpd
root      3890  0.0  0.3 103228  864 pts/0    S+  22:25  0:00          \_ grep httpd
root      3879  0.5  4.1 281892 10220 ?        Ss  22:25  0:00 /usr/sbin/httpd
apache    3881  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3882  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3883  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3884  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3885  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3886  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3887  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3888  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd

第二列就是进程的ID了,而3879 我们可以明显的看出来他是httpd服务器的父进程,从3881到3888是httpd服务器的子进程了,如果杀死子进程,只是针对自己起作用。

[root@yufei ~]#  kill -15 3888
[root@yufei ~]# ps auxf |grep httpd
root      3893  0.0  0.3 103228  864 pts/0    S+  22:28  0:00          \_ grep httpd
root      3879  0.0  4.1 281892 10220 ?        Ss  22:25  0:00 /usr/sbin/httpd
apache    3881  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3882  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3883  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3884  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3885  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3886  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd
apache    3887  0.0  2.2 281892  5548 ?        S    22:25  0:00  \_ /usr/sbin/httpd

3888这个进程没有了


而如果杀死父进程,那么所有的子进程也就完了

[root@yufei ~]#  kill -15 3879
[root@yufei ~]# ps auxf |grep httpd
root      3895  0.0  0.0  2644  168 pts/0    D+  22:29  0:00          \_ grep httpd

我们再启动httpd服务

[root@yufei ~]# service httpd start
Starting httpd:                                            [  OK  ]

[root@yufei ~]# ps auxf |grep httpd
root      3920  0.0  0.3 103228  860 pts/0    S+  22:30  0:00          \_ grep httpd
root      3909  0.2  4.1 281892 10220 ?        Ss  22:30  0:00 /usr/sbin/httpd
apache    3911  0.0  2.2 281892  5548 ?        S    22:30  0:00  \_ /usr/sbin/httpd
apache    3912  0.0  2.2 281892  5548 ?        S    22:30  0:00  \_ /usr/sbin/httpd
apache    3913  0.0  2.2 281892  5548 ?        S    22:30  0:00  \_ /usr/sbin/httpd
apache    3914  0.0  2.2 281892  5548 ?        S    22:30  0:00  \_ /usr/sbin/httpd
apache    3915  0.0  2.2 281892  5548 ?        S    22:30  0:00  \_ /usr/sbin/httpd
apache    3916  0.0  2.2 281892  5548 ?        S    22:30  0:00  \_ /usr/sbin/httpd
apache    3917  0.0  2.2 281892  5548 ?        S    22:30  0:00  \_ /usr/sbin/httpd
apache    3918  0.0  2.2 281892  5548 ?        S    22:30  0:00  \_ /usr/sbin/httpd
[root@yufei ~]# kill -1 3909


重新加载父进程,发现进程的PID都不变,这下明白了吧,为什么在不当机的情况下,可以重新加载新配置文件了吧,这对一些服务器来说,是很重要的哦,所以我在这里演示了一下。

[root@yufei ~]# ps auxf |grep httpd
root      3930  0.0  0.3 103228  864 pts/0    S+  22:31  0:00          \_ grep httpd
root      3909  0.2  4.9 281840 12216 ?        Ss  22:30  0:00 /usr/sbin/httpd
apache    3921  0.0  2.5 281972  6236 ?        S    22:31  0:00  \_ /usr/sbin/httpd
apache    3922  0.0  2.5 281972  6236 ?        S    22:31  0:00  \_ /usr/sbin/httpd
apache    3923  0.0  2.5 281972  6236 ?        S    22:31  0:00  \_ /usr/sbin/httpd
apache    3924  0.0  2.5 281972  6236 ?        S    22:31  0:00  \_ /usr/sbin/httpd
apache    3925  0.0  2.5 281972  6236 ?        S    22:31  0:00  \_ /usr/sbin/httpd
apache    3926  0.0  2.5 281972  6236 ?        S    22:31  0:00  \_ /usr/sbin/httpd
apache    3927  0.0  2.5 281972  6236 ?        S    22:31  0:00  \_ /usr/sbin/httpd
apache    3928  0.0  2.5 281972  6236 ?        S    22:31  0:00  \_ /usr/sbin/httpd

对于一些正常结束不掉的进程,如僵尸进程,可以用kill -9 来强制终止。


killall 通过程序的名字,直接杀死所有进程。注意,这是全部进程哦,是根据进程名来操作的。killall 也和ps或pgrep 结合使用,比较方便。

[root@yufei ~]# pgrep httpd
3909
3921
3922
3923
3924
3925
3926
3927
3928
[root@yufei ~]# killall httpd
[root@yufei ~]# pgrep httpd
[root@yufei ~]#pkill

和killall 应用方法差不多,也是直接杀死运行中的程序,这个自己动手做一下吧。

注意:如果您想杀掉单个进程的话,记得要用kill来结束啊,还有就是在不当机的情况下,重新加载新配置也是要用kill。


xkill 是在桌面用的杀死图形界面的程序

比如当某个程序崩溃不能退出的时候,运行xkill这个命令,就会看到鼠标变成X,左键点哪个,哪个程序就关掉了,如果想取消xkill的话,就点鼠标右键。

最后我们来讲一下进程的优先级
这个就和打印的优先级差不多,如果说某个进程太占用系统的资料,那我们可以调整他的优先级,让他在系统闲置的时候再进行。我们在前面的相关内容中也提到了进程的优先级,Linux和AIX是从-20到19,HP-UX为0到39,数值越小,优先级就越高。也就是说-20是最高的。那么如何来调整呢?就要用到nice或renice

格式是

nice  -n  优先级  程序

一开始执行程序就立即给予一个特定的 nice 值用 nice

调整某个已经存在的 PID 的 nice 值用 renice

这个自己来尝试吧,不在演示!