基础命令

kill是我们杀死进程的最常见命令,用法如下:

kill [-s sigspec | -n signum | -sigspec] pid | jobspec … or kill -l [sigspec]

其中-s搭配的是系统信号,用kill -l查看下有哪些信号:

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

看起来好多,有点吓人,但是我们常用的其实就是第9个,也就是直接杀死进程。已杀死php-fpm进程为例,首先,我们通过ps命令查看进程pid。

ps aux ,输出如下

[root@template ~]# ps -ef | grep php-fpm
root       2013      1  0 10:14 ?        00:00:00 php-fpm: master process (/etc/opt/rh/rh-php56/php-fpm.conf)
apache     2014   2013  0 10:14 ?        00:00:00 php-fpm: pool www
apache     2015   2013  0 10:14 ?        00:00:00 php-fpm: pool www
apache     2016   2013  0 10:14 ?        00:00:00 php-fpm: pool www
apache     2017   2013  0 10:14 ?        00:00:00 php-fpm: pool www
apache     2018   2013  0 10:14 ?        00:00:00 php-fpm: pool www
root       2023   1492  0 10:24 pts/0    00:00:00 grep –color=auto php-fpm

第二列就是进程pid,接下来,我们用

kill -9 2013
kill -9 2014

来一条条的杀死进程,最后一个是我们使用grep命令筛选本身的进程,这个需要忽略,可以这么改进下:

[root@template ~]# ps -ef | grep php-fpm | grep -v grep
root 2013 1 0 10:14 ? 00:00:00 php-fpm: master process (/etc/opt/rh/rh-php56/php-fpm.conf)
apache 2014 2013 0 10:14 ? 00:00:00 php-fpm: pool www
apache 2015 2013 0 10:14 ? 00:00:00 php-fpm: pool www
apache 2016 2013 0 10:14 ? 00:00:00 php-fpm: pool www
apache 2017 2013 0 10:14 ? 00:00:00 php-fpm: pool www
apache 2018 2013 0 10:14 ? 00:00:00 php-fpm: pool www

杀死的时候,也可以用一点小技巧

kill -9 201{3..8}
上面的意思就是匹配进程pid2013到2018之前的进程。

改进:使用pgrep

pgrep是专门用来查找进程的类grep命令。用法也很简单,例如

[root@template ~]# pgrep php-fpm
2049
2050
2051
2052
2053
2054

另外,pgrep对进程名字不用完全匹配,例如上面如果用pgrep fpm,理论上输出的pid应该是一样的。

接下来,还是用kill命令杀死即可。

使用pidof

pidof用法如下:
[root@template ~]# pidof php-fpm
2054 2053 2052 2051 2050 2049
需要注意的是,pidof输出的pid是写在一行之中的,看起来不方便,如果有海量进程的话,字符太多可能会溢出,另外,pidof查询必须知道确切的进程名称,不能模糊匹配,像上面那种pidof fpm是查不到pid的!

接下来,我们还是继续用kill命令,杀死一个个pid即可。

通过管道,一次杀死进程

上面的都是先查出pid,再一个个杀死进程,其实,通过linux系统的管道,我们可以直接一次杀死进程。例如,第一个用ps查找pid的命令,我们可以这样改进:

ps -ef | grep php-fpm | grep -v grep | awk ‘{print $2}’ | xargs kill -9

上面的命令,前三个都是和最上面一样的,第四个通过awk命令输出第二列的进程pid号,最后通过xargs调用kill命令把一个个pid杀死。

看起来这个不错,不过,这个缺点很明显,管道太多,命令太长了,打了很多字!

pgrep pidof加上管道,杀死进程

pgrep php-fpm | xargs kill -9

不通过xargs传递参数杀死进程的方法

kill -9 `ps -ef | grep php-fpm | grep -v grep | awk '{print $2}'`

pgrep不通过xargs传递参数

kill -9 `pgrep php-fpm`

通过pkill杀死进程

pkill,顾名思义,就是pgrep+kill的意思,用法更简单了

pkill -9 php-fpm

通过killall杀死进程

killall -9 php-fpm

killall和pkill不同,必须知道确切的程序名称才行,否则会提示找不到进程,报错。

总结:

想php-fpm那样,有很多进程的程序,最好使用pkill杀死进程,杀死的时候,最好把程序的名称填写完全了,以免误杀。部分程序会加载不同的配置,开启多个服务,这时候不能一股脑杀死,此时,推荐使用上面的通过grep截取进程关键字的方法杀死进程。

例如,对于加载两个配置文件的uwsgi进程
[root@web ~]# ps aux | grep uwsgi | grep -v grep
root     22352  0.0  0.1 355824 27500 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas3_uwsgi.ini
root     22354  0.0  0.1 276100 27304 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas_uwsgi.ini
root     22374  0.0  0.0 276100 22964 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas_uwsgi.ini
root     22375  0.0  0.1 356500 25240 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas3_uwsgi.ini
root     22376  0.0  0.0 276100 22964 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas_uwsgi.ini
root     22377  0.0  0.0 355960 24244 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas3_uwsgi.ini
root     22378  0.0  0.0 276100 22964 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas_uwsgi.ini
root     22379  0.0  0.0 355500 22396 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas3_uwsgi.ini
root     22380  0.0  0.0 276100 22964 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas_uwsgi.ini
root     22381  0.0  0.0 355820 24028 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas3_uwsgi.ini
root     22382  0.0  0.0 276100 22968 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas_uwsgi.ini
root     22383  0.0  0.0 276100 22968 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas_uwsgi.ini
root     22384  0.0  0.0 355500 22388 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas3_uwsgi.ini
root     22385  0.0  0.0 276100 22968 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas_uwsgi.ini
root     22386  0.0  0.0 356260 24164 ?        S    Sep02   0:00 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas3_uwsgi.ini
root     22387  0.0  0.1 361964 28076 ?        S    Sep02   0:01 /usr/local/pythonbrew/pythons/Python-2.7.5/bin/uwsgi sas3_uwsgi.ini
我们需要杀死加载sas3_uwsgi.ini配置的uwsgi进程时,可以这样
ps -ef | grep sas3_uwsgi.ini | grep -v grep | awk ‘{print $2}’ | xargs kill -9

补充:

有时候,我们想取消挂载的时候,会发现有很多非root用户在使用这些挂载分区,要杀死一个用户的所有进程,有如下方法:

pkill -u alice
killall -u alice
ps -ef | grep alice | awk '{ print $2 }' | xargs kill -9
pgrep -u alice | xargs kill -9

 

 

Linux杀死进程的几种姿势

发表评论

电子邮件地址不会被公开。 必填项已用*标注