小编典典

重击:等待超时

linux

在Bash脚本中,我想执行以下操作:

app1 &
pidApp1=$!
app2 &
pidApp2=$1

timeout 60 wait $pidApp1 $pidApp2
kill -9 $pidApp1 $pidApp2

即,在后台启动两个应用程序,并给它们60秒以完成其工作。然后,如果他们没有在该时间间隔内完成,请杀死他们。

不幸的是,上述内容不起作用,因为timeout它是可执行文件,而wait它是Shell命令。我尝试将其更改为:

timeout 60 bash -c wait $pidApp1 $pidApp2

但这仍然行不通,因为wait只能在同一外壳程序内启动的PID上进行调用。

有任何想法吗?


阅读 242

收藏
2020-06-03

共1个答案

小编典典

将PID写入文件并像这样启动应用程序:

pidFile=...
( app ; rm $pidFile ; ) &
pid=$!
echo $pid > $pidFile
( sleep 60 ; if [[ -e $pidFile ]]; then killChildrenOf $pid ; fi ; ) &
killerPid=$!

wait $pid
kill $killerPid

这将创建另一个hibernate超时的进程,如果尚未完成,则终止该进程。

如果该过程完成得更快,则将删除PID文件,并终止终止进程。

killChildrenOf是一个脚本,可获取所有进程并杀死某个PID的所有子代。

如果要退出BASH,则可以将PID和超时写入目录,并观察该目录。每分钟左右,阅读条目并检查哪些进程仍然存在以及它们是否超时。

编辑 如果您想知道该进程是否已成功终止,则可以使用kill -0 $pid

ps -fjww -p 146322 | tail -n 1 | awk '{ print $4 }'

在我的情况下:145974。然后,可以将PGID与kill的特殊选项一起使用以终止组中的所有进程: kill -- -145974

2020-06-03