在kill的所有信号中,有一个十分特殊的信号值0,使用格式为kill -0 $pid。其中的-0表示不发送任何信号给$pid对应的进程,但是仍然会对$pid是否存在对应的进程进行检查,如果$pid对应的进程已存在,则返回0,若不存在则返回1。
[root@Mr_chen ~]# pgrep -l sshd 985 sshd 1131 sshd [root@Mr_chen ~]# kill -s 0 985 [root@Mr_chen ~]# echo $? 0 [root@Mr_chen ~]# kill -s 0 986 bash: kill: (986) - No such process [root@Mr_chen ~]# echo $? 1应用:如果同学们想要写一个管理系统服务的脚本,则可以使用这个技巧。
1.3 killall:通过进程名终止进程 1.3.1 命令解释功能说明:
使用kill命令终止进程还需要先获取进程的pid进程号,这个过程有点繁琐,而使用killall命令就可以直接用“kill 进程名”这种形式终止进程。
选项说明:
参数选项 解释说明(带@为重点)-I 不区分大小写匹配
-g 终止属于该进程组的进程
-i 在终止进程之前询问是否确认
-l 列出所有已知的信号名
-q 如果没有进程终止则不提示
-r 使用正则表达式匹配要终止的进程名称
-s 用指定的信号代替默认信号
-u 终止指定用户的进程@
-v 报告信号是否发送成功
-w 等待所有被终止的进程死去。killall每秒都会检查一次被终止的进程是否仍然存在,其仅在都死光后才返回。注意,如果信号被忽略,或者没有起作用,或者进程停留在僵尸状态,那么killall可能会永久等待@
1.3.2 使用范例
(1)终止定时任务服务进程的例子
首先我们要知道定时任务的进程名是crond,终止该进程的命令如下:
[root@Mr_chen ~]# killall crond [root@Mr_chen ~]# killall crond #用killall终止进程可执行多次 crond: no process killed #等看到这个结果说明进程死了 [root@Mr_chen ~]# [root@Mr_chen ~]# /etc/init.d/crond start #启动服务 Starting crond: [ OK ] [root@Mr_chen ~]# killall -w crond #使用-w参数,会看到等待几秒后结束命令操作 [root@Mr_chen ~]# killall -w crond crond: no process killed(2)终止指定用户的所有进程
[root@Mr_chen ~]# ps -u yunjisuan -l #查看普通用户的所有进程详细信息 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 500 1175 1174 0 80 0 - 27076 wait pts/1 00:00:00 bash 0 S 500 1210 1175 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash 0 T 500 1235 1210 0 80 0 - 35884 signal pts/1 00:00:00 vim [root@Mr_chen ~]# killall -u yunjisuan vim #杀掉指定用户的vim进程 [root@Mr_chen ~]# ps -u yunjisuan -l #成功 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 500 1175 1174 0 80 0 - 27076 wait pts/1 00:00:00 bash 0 S 500 1210 1175 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash特别提示:
这种方式可以终止所有归属于yunjisuan用户的vim进程。在之前,我在给同学们讲nginx优化时提到过nginx的监牢模式和在和给同学们讲解sudo时提到过企业的集权分治策略,他们都是利用普通用户来启动服务。此时,我们可以指定用户杀死该用户启动的某一服务的所有进程。
功能说明:
pkill命令可通过进程名终止指定的进程。使用killall终止进程需要连续执行几次,而pkill可以杀死指定进程及其所有子进程。
选项说明:
参数选项 解释说明(带@为重点)-t终端 杀死指定终端的进程@
-u用户 杀死指定用户的进程@
1.4.2 使用范例
(1)通过进程名终止进程
[root@Mr_chen ~]# /etc/init.d/crond status #查看定时任务程序运行状态 crond (pid 1274) is running... [root@Mr_chen ~]# pkill crond #终止定时任务进程 [root@Mr_chen ~]# /etc/init.d/crond status crond dead but subsys locked #进程被终止(2)通过终端名终止进程
[root@Mr_chen ~]# w #第二列TTY就是用户运行的终端 15:57:09 up 1:05, 3 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT yunjisua tty1 - 15:55 12.00s 0.02s 0.01s vim ttt root pts/0 192.168.200.1 14:51 0.00s 0.07s 0.00s w root pts/1 192.168.200.1 15:19 3:28 0.01s 0.00s bash [root@Mr_chen ~]# ps -u yunjisuan -l #查看用户的进程 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 500 1175 1174 0 80 0 - 27076 wait pts/1 00:00:00 bash 0 S 500 1210 1175 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash 4 S 500 1333 1322 0 80 0 - 27075 wait tty1 00:00:00 bash 0 S 500 1359 1333 0 80 0 - 35890 poll_s tty1 00:00:00 vim [root@Mr_chen ~]# pkill -t tty1 #杀掉终端正在运行的进程 [root@Mr_chen ~]# ps -u yunjisuan -l #vim进程没了 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 500 1175 1174 0 80 0 - 27076 wait pts/1 00:00:00 bash 0 S 500 1210 1175 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash 4 S 500 1333 1322 0 80 0 - 27075 n_tty_ tty1 00:00:00 bash [root@Mr_chen ~]# pkill -9 -t tty1 #强行杀掉tty1终端(踢掉用户) [root@Mr_chen ~]# ps -u yunjisuan -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 500 1175 1174 0 80 0 - 27076 wait pts/1 00:00:00 bash 0 S 500 1210 1175 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash [root@Mr_chen ~]# w #tty1终端没了 15:58:17 up 1:06, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.200.1 14:51 0.00s 0.08s 0.00s w root pts/1 192.168.200.1 15:19 4:36 0.01s 0.00s bash