Ada*_*ski 10 command-line scripting timeout
我有几个模拟要做,每个模拟都用python simulate.py <parameter list>
. 这些模拟的问题在于其中一些没有退出就挂起,这使我无法使用简单的脚本批量运行它们。
我需要的是某种形式的“运行时约束”命令,它会在指定时间后自动终止进程(最好通过虚拟按下Ctrl+C,但我认为简单的 kill 也可以),如果这个过程本身并没有优雅地结束。
当然,我可以自己编写这样的脚本,但我怀疑有人已经在我之前完成了,所以我不必花费数小时使用ps
,time
和 bash 手册重新发明轮子。
slm*_*slm 16
使用timeout
命令:
$ date
Mon May 6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May 6 07:35:14 EDT 2013
Run Code Online (Sandbox Code Playgroud)
如果它在一段时间后还没有停止,您也可以在timeout
命令中加入一个守卫kill
。
$ date
Mon May 6 07:40:40 EDT 2013
$ timeout -k 20 5 sleep 100
$ date
Mon May 6 07:40:48 EDT 2013
Run Code Online (Sandbox Code Playgroud)
这将在进程sleep 100
停止后最多等待 20 秒,如果它仍在运行,timeout
则将向其发送kill
信号。
另一种方法,虽然风险更大的方法如下:
./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"
Run Code Online (Sandbox Code Playgroud)
在 Stack Overflow 上的一个题为:限制程序在 Linux 中运行的时间的问题中发现了这种技术。具体这个答案。
注意:根据@mattdm 留下的评论,上述方法可能存在风险,因为它假设自您的流程以来没有启动任何新流程。所以没有分配新的PID。鉴于此,这种方法可能不应该使用,而只是作为解决问题的一般方法的参考。该timeout
方法是 2 中更好的选择。