在Bash脚本中,我想执行以下操作:
app1 & pidApp1=$! app2 & pidApp2=$1 timeout 60 wait $pidApp1 $pidApp2 kill -9 $pidApp1 $pidApp2
即,在后台启动两个应用程序,并给它们60秒以完成其工作。然后,如果他们没有在该时间间隔内完成,请杀死他们。
不幸的是,上述内容不起作用,因为timeout它是可执行文件,而wait它是Shell命令。我尝试将其更改为:
timeout
wait
timeout 60 bash -c wait $pidApp1 $pidApp2
但这仍然行不通,因为wait只能在同一外壳程序内启动的PID上进行调用。
有任何想法吗?
将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的所有子代。
killChildrenOf
如果要退出BASH,则可以将PID和超时写入目录,并观察该目录。每分钟左右,阅读条目并检查哪些进程仍然存在以及它们是否超时。
编辑 如果您想知道该进程是否已成功终止,则可以使用kill -0 $pid
kill -0 $pid
ps -fjww -p 146322 | tail -n 1 | awk '{ print $4 }'
在我的情况下:145974。然后,可以将PGID与kill的特殊选项一起使用以终止组中的所有进程: kill -- -145974
kill -- -145974