bash脚本杀死竞争条件

时间:2015-07-16 13:11:36

标签: linux bash shell process kill

我有一个调用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 -9kill -9 process (PID 17172),那就一切都好了。

无论如何,我可以阻止"kill -9"悬挂在第一位吗?确保在2秒内杀死进程是一种后备。我不想添加其他背景检查以检查后备kill -9

更新

我能找到的最佳答案是在kill -9上使用timeout命令:

timeout -s 9 2 kill -9 $PID

这将确保在2秒后,如果kill -9挂起,则超时会在其上发出kill -9

1 个答案:

答案 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秒,然后查看该过程来检查竞争状况。这至少可以缓解脚本停滞但不能解决竞争条件。