我必须使用 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