原文地址: Linux提取匹配指定字符串的进程号
定个小目标
现在提出我们的需求:通常在运维过程中,会有一些进程是在后台运行的,这个时候我们如果 筛选出指定的进程,并kill掉
就是接下来要讨论的问题了。
尝试用 grep 和 awk 实现
现在有一个进程是通过 nohup java -jar ./CCNController-1.0.jar /router/pku/n1 &
命令启动并实现在后台运行的,我们接下来的目标就是要过滤出这个进程的进程号
-
过滤出该进程
ps -aux | grep CCNController
得到如下结果(其中第一行是grep命令进程,第二行是目标进程)
mingj 7078 0.0 0.0 14664 1084 pts/0 S+ 09:32 0:00 grep CCNController mingj 14425 0.0 0.3 4767808 25940 ? Sl 11月13 0:26 java -jar ./CCNController-1.0.jar /router/pku/n1
-
用awk命令选出第二列的进程号
ps -aux | grep CCNController | awk '{print $2}'
得到如下结果
8946 14425
-
接下来就是kill掉过滤出的进程
kill $(ps -aux | grep CCNController | awk '{print $2}')
得到如下结果
bash: kill: (9171) - 没有那个进程
实际上,我们要kill掉的
目标进程已经成功被杀掉了
,报这一行错误是因为我们用上面的命令筛选出的进程号有两个,一个是目标进程号
,一个是筛选命令中包含的grep命令的执行进程的
,实际上grep命令在筛选命令执行结束的时候就已经退出了。我们再去kill一个已经退出的进程号,当然会报错。如果我们只是想要在终端kill某个进程,这样做就ok了,但是我们如果用在一些脚本编程当中(比如用ssh远程执行命令的脚本),会导致脚本中断执行,接下来我们的任务是
将筛选结果中grep命令的进程去除掉
=> 喜大普奔,grep命令中有一个-v
参数可以排除包含指定字符串的行
最终实现
-
查询
ps -aux | grep CCNController | grep -v grep | awk '{print $2}'
-
查询并删除
kill$(ps -aux | grep CCNController | grep -v grep | awk '{print $2}')