我有一个调用 kill $PID
的 bash 脚本,然后等待 2 秒,如果 $PID
仍然存在(通过检查 ps
),它调用 kill -9 $PID
作为回退。据我所知,这是一个非常标准的终止进程的脚本,可以在网上的许多示例脚本中找到。
脚本运行良好(我不担心 PID 在这里重用),但今天我设法捕获了一个罕见的竞争条件,进程在 2 秒内仍然被杀死,并且 kill -9 挂起
。这是 ps
输出:
root 17172 0.0 0.0 7920 1668 ? S Jul16 0:00 /bin/kill -9 16635
root 17173 0.0 0.0 0 0 ? Z Jul16 0:00 [kill] <defunct>
kill -9
挂起是因为它命中了一个不存在的进程(即来自之前的 kill),即 PID 16635
是已经被第一个 kill 杀死的进程.
如果我对 kill -9 进程 (PID 17172)
执行 kill -9
,那么一切都很好。
无论如何,我是否可以首先阻止 "kill -9"
挂起?确保进程在 2 秒内被杀死是一种回退。我不想添加另一个背景检查来检查后备 kill -9
。
更新:
我能找到的最佳答案是在 kill -9
上使用超时命令:
timeout -s 9 2 kill -9 $PID
这将确保在 2 秒后,如果 kill -9
挂起,超时将在其上发出 kill -9
。
最佳答案
这可能是检查进程是否仍然存在以及是否应该发送 kill -9
kill [pid]
sleep 5
kill -0 [pid]
if [ $? -eq 0 ] ; then
echo 'process not terminated'
kill -9 [pid]
else
echo 'process terminated'
fi
这使用通过 kill 发送信号来确保您有权向进程 kill -0
发送 kill 信号。这可能比检查 PID
是否仍然存在更好。然后,如果您确实有权访问该程序,则终止该程序。您唯一可以做的另一件事是进入更长的 sleep 时间或一些重要的事情,例如编写您自己的 kill 或检查进程状态等。
您还可以再做一次 sleep ,然后通过在大约 20 秒后查看 kill -9
是否仍然存在来检查竞争条件,然后终止该进程。这至少会缓解脚本的停顿,但不会解决竞争条件。
关于linux - bash 脚本杀死竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31455178/