如何限制程序在 Linux 中运行的时间?

Ada*_*ski 10 command-line scripting timeout

我有几个模拟要做,每个模拟都用python simulate.py <parameter list>. 这些模拟的问题在于其中一些没有退出就挂起,这使我无法使用简单的脚本批量运行它们。

我需要的是某种形式的“运行时约束”命令,它会在指定时间后自动终止进程(最好通过虚拟按下Ctrl+C,但我认为简单的 kill 也可以),如果这个过程本身并没有优雅地结束。

当然,我可以自己编写这样的脚本,但我怀疑有人已经在我之前完成了,所以我不必花费数小时使用ps,time和 bash 手册重新发明轮子。

slm*_*slm 16

潜在的解决方案#1

使用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信号。

潜在的解决方案#2

另一种方法,虽然风险更大的方法如下:

./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 中更好的选择。

  • **假设** `myProgram` 在比 `sleep` 更短的时间内完成(不是一个不合理的假设,因为目标是设置*最大*允许的运行时间)。然后,您将信号发送到不存在的 PID(没有造成真正的伤害)或*到系统上的任何随机进程*(可能是致命的)。 (2认同)