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


10

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

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

当然,我可以写这样的剧本,不过我怀疑有人已经做到了我面前,所以我不必重新发明轮子花小时pstime和bash手册。

Answers:


15

潜在解决方案#1

使用timeout命令:

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

如果过了一段时间,该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

该进程sleep 100应停止后最多等待20秒钟,如果该进程仍在运行,timeout则会向其发送kill信号。

潜在解决方案2

另一种替代方法,尽管风险更高,如下所示:

./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"

在题为:限制程序在Linux中运行的时间的问题中的Stack Overflow上找到了该技术。具体来说就是这个答案

注意:根据@mattdm的评论,上述方法可能会有风险,因为它假设自您的过程以来没有任何新的过程开始。因此,没有分配新的PID。鉴于此,可能不应该使用这种方法,而只是在此作为解决问题的一般方法的参考。该timeout方法是2中的更好选择。


但是可以保证脚本将始终花费所有时间。就我而言,这不是1秒,而是15分钟。
亚当·里奇科夫斯基

但是,在该问题中找到的另一个解决方案应该正是我所需要的。谢谢!
亚当·里奇科夫斯基

2
假定 myProgram完成的时间少于sleep(不是不​​合理的假设,因为目标是设置最大允许的运行时间)。然后,您将信号发送到不存在的PID(没有真正的危害)或系统上的任何随机过程(可能致命)。
CVn

1
@MichaelKjörling,感谢您的退款。我也根据OP留下的相同评论更新了答案。看起来该timeout命令完全符合他的要求,等待OP响应我的评论。
slm

@slm timeout应该是我需要的解决方案。目前,我正在对其进行测试
Adam Ryczkowski

4

我发现一些好一点,比timeouttimelimit

它有几个优点;一种是用户可以通过按“ Ctrl + C”来手动中止执行。

timelimit程序在Debian存储库中可用。


1
试图了解b / w时限和超时的差异。超时可以使用Ctrl + C停止。其他优势是什么?
slm

好吧,我的超时不能。我使用Mint 14(基于Ubuntu Quantal)。
亚当·里奇科夫斯基

3

您可以使用来调整cpu时间和其他功能ulimit,尤其是cpu时间:

$ ulimit -t 60      # limit to 60 seconds
$ program

请参阅以下U&L问答:unix.stackexchange.com/a/4666/7453。@Gilles很好地概述了ulimit用于此目的。
slm

0

Bash使用一个称为$BASHPID它的变量,可以在这种情况下使用它,例如:

#!/bin/bash
do_face() {
    local parent=$1
    echo $BASHPID > pid
    sleep 10
    echo "Killing parent $parent"
    kill $parent
}

ME=$BASHPID
eval $(echo "do_face $ME &")
sleep 20 && kill $(cat pid) && echo "killed child $(cat pid)"
exit 1

您可以在调用的参数更改为sleepdo_face()100代替10并看看会发生什么时,孩子的时间太长做他的差事。只需将进入休眠状态的调用更改do_face()为对可执行文件的调用,如果花费的时间太长,脚本就会将其杀死,20在此示例中,秒是极限值。可以实现参数,以使其成为一个简单的脚本来调用,并且可以由其他脚本批量或以其他方式调用。处理每个并发进程的pid文件是一个需要处理的问题,也许使用不同的子目录。

注意:在GNU Linux上,sleep可以接受浮点参数,例如sleep 0.1睡眠十分之一秒。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.