杀死正在运行的进程实例,但由于当前执行的命令而触发的实例除外

杀死正在运行的进程实例,但由于当前执行的命令而触发的实例除外

我必须使用 shell 脚本杀死所有正在运行的 Xvfb 实例,因此有以下代码 -

for pid in $(ps -ef | awk '/Xvfb/ {print $2}'); do kill -9 $pid; done

它会杀死所有实例,但有一个实例失败并出现以下错误 -

kill: (142898) - No such process

上面执行的命令似乎又创建了一个实例,但在杀死时该实例不再存在。在这种情况下,我怎样才能跳过它并成功使用脚本?

答案1

问题是您将 的输出通过管道传输ps到查找字符串“Xvfb”的调用中awk,因此在其自己的命令行中也包含字符串“Xvfb”。因为管道的两个进程是同时执行的,所以awk调用本身也将在输出中注册(尝试一下如果您只是在命令行上ps键入会发生什么)。ps -ef | awk '/Xvfb/'

然而,当循环开始时(当命令替换$( … )awk进程也退出时发生),这个awk进程不再存在,因此kill偶然发现了这一点。

如果将命令替换中的命令修改为

ps -ef | awk '$0 ~ /Xvfb/ && index($0,"awk")==0 {print $2}'

这将确保awk列表中不包含包含子字符串的命令。

答案2

您正试图杀死awk.

避免这种情况的一个简单的正则表达式技巧是使用某种转义。例如wor[d]

所以对于你的代码(添加了变量引用)

for pid in $(ps -ef | awk '/Xvf[b]/ {print $2}'); do kill -9 "$pid"; done

相关内容