Answers:
使用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
信号。
另一种替代方法,尽管风险更高,如下所示:
./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"
在题为:限制程序在Linux中运行的时间的问题中的Stack Overflow上找到了该技术。具体来说就是这个答案。
注意:根据@mattdm的评论,上述方法可能会有风险,因为它假设自您的过程以来没有任何新的过程开始。因此,没有分配新的PID。鉴于此,可能不应该使用这种方法,而只是在此作为解决问题的一般方法的参考。该timeout
方法是2中的更好选择。
myProgram
完成的时间少于sleep
(不是不合理的假设,因为目标是设置最大允许的运行时间)。然后,您将信号发送到不存在的PID(没有真正的危害)或系统上的任何随机过程(可能致命)。
timeout
命令完全符合他的要求,等待OP响应我的评论。
timeout
应该是我需要的解决方案。目前,我正在对其进行测试
您可以使用来调整cpu时间和其他功能ulimit
,尤其是cpu时间:
$ ulimit -t 60 # limit to 60 seconds
$ program
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
您可以在调用的参数更改为sleep
在do_face()
以100
代替10
并看看会发生什么时,孩子的时间太长做他的差事。只需将进入休眠状态的调用更改do_face()
为对可执行文件的调用,如果花费的时间太长,脚本就会将其杀死,20
在此示例中,秒是极限值。可以实现参数,以使其成为一个简单的脚本来调用,并且可以由其他脚本批量或以其他方式调用。处理每个并发进程的pid文件是一个需要处理的问题,也许使用不同的子目录。
注意:在GNU Linux上,sleep
可以接受浮点参数,例如sleep 0.1
睡眠十分之一秒。