我有一个调用kill $PID
的bash脚本,然后等待2秒,如果$PID
仍然存在(通过选中ps
),则会调用kill -9 $PID
作为后备。 AFAIK,这是一个非常标准的杀死进程的脚本,可以在网上的许多示例脚本中找到。
脚本运行正常(我不担心这里的PID重用),但是今天我设法捕获了一个罕见的竞争条件,其中进程仍然在2秒内被杀死,kill -9 hangs
。这是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
正在挂起,因为它已经达到了一个已经失效的过程(即来自之前的杀戮),即PID 16635
是已经被第一次杀戮杀死的过程。
如果我在kill -9
上kill -9 process (PID 17172)
,那就一切都好了。
无论如何,我可以阻止"kill -9"
悬挂在第一位吗?确保在2秒内杀死进程是一种后备。我不想添加其他背景检查以检查后备kill -9
。
更新:
我能找到的最佳答案是在kill -9
上使用timeout命令:
timeout -s 9 2 kill -9 $PID
这将确保在2秒后,如果kill -9
挂起,则超时会在其上发出kill -9
。
答案 0 :(得分:0)
这可能是检查流程是否仍然存在的更好方法,以及是否应发送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
发送一个终止信号。哪个可能比检查PID
是否仍然存在更好。然后,如果您确实有权访问该程序,则终止该程序。你可以做的唯一另一件事就是进行更长时间的睡眠,或者像写自己的杀戮或检查过程状态等非常重要的事情等。
此外,您可以再次进行睡眠,然后通过在kill -9
仍处于活动状态后查看20秒,然后查看该过程来检查竞争状况。这至少可以缓解脚本停滞但不能解决竞争条件。