kill -9 `ps -ef|grep cpu|grep -v grep|awk '{print $2}'`命令解析
1、场景
在一个Linux机器上起了很多个cpu.sh的脚本,如下图,想一次性把他们kill掉
2、方法
2.1去除grep cpu
上图中可以看到最后一个pid为22603的进程是grep cpu进程,并非cpu.sh,怎么把它去除呢,通过ps -efw | grep cpu |grep -v grep达到目的
为什么能达到这个效果?
我们通过grep --help看
可以看出
1.grep 是查找含有指定文本行的意思,比如grep cpu 就是查找含有cpu的文本的行
2.grep -v 是反向查找的意思,比如 grep -v grep 就是查找不含有 grep 字段的行
2.2杀进程
使用ps -efw一个一个查看cpu.sh的PID,然后一个一个kill -9 PID或 kill -9 PID1 PID2 PID3
kill -9后面支持多个PID,意思是将这些PID全部kill掉
2.3进阶
kill -9 `ps -ef|grep cpu|grep -v grep|awk '{print $2}'`
kiil -9后面``里面的内容表示参数输入,而ps -ef|grep cpu|grep -v grep|awk '{print $2}'的的效果需要说明Linux的一个原理
管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。
那么这个命令行的解析如下:
1、ps -ef 显示所有的进程,其中后面的e是显示结果的意思,f是显示完整格式,其他比如-w是不限制列宽显示,具体可见ps --help all
2、ps -ef|grep cpu作用是把包括cpu这个关键字的进程都显示出来
3、如2.1所示,ps -ef|grep cpu会把grep cpu的进程也统计进来,因此用ps -ef|grep cpu|grep -v grep去除grep进程
4、最后,只包含cpu关键字的进程筛选结果作为输入给awk '{print $2}',这个部分的作用是提取输入的第二列,而第二列正是进程的PID
执行效果见下图
附录:
本文内容参考了
https://blog.****.net/beyondlpf/article/details/8065070
作者还提及了pgrep、pidof、xargs、pkill和killall等命令行,很有意思,尤其是pkill,达到本文档目的用pkill只需要pkill -9 cpu即可,很简洁,但不知道在我的机器上为何没有生效,mark下,后续研究