2010-02-02 71 views
1

我不是脚本专家,我想知道什么是最多x毫秒运行脚本的可接受方式(并且如果脚本在超时之前完成,则在x毫秒之前完成)。Un * x shell脚本:最多x毫秒运行脚本的正确方法是什么?

我使用Bash解决了这个问题,我认为这很不方便,我想知道是否有更好的方法来做到这一点。

基本上我有一个shell脚本称为sleep_kill.sh接受一个PID作为第一个参数和超时作为其第二个参数,并且这样处理:

sleep $2 
kill -9 $1 2> /dev/null 1> /dev/null 

因此,如果PID对应于一个脚本在超时之前完成,没有任何事情会被杀死(我认为操作系统没有时间重复使用这个PID作为另一个[无关的]进程,看到它在所有进程ID中“循环”,然后开始重用它们)。

无论如何,后来我打电话给我的剧本,可能“挂起”或超时:

command_that_may_hang.sh 
PID=$! 
sleep_kill.sh $PID .3 
wait $PID > /dev/null 2>&1 

我会等待最多300毫秒command_that_may_hang.sh。然而,如果command_that_may_hang.sh只需要10毫秒执行,我将不会在300毫秒内“卡住”。

如果一些shell专家可以解释这种方法的缺点以及应该做些什么,那将会很棒。

+2

请参阅http://stackoverflow.com/questions/526782/how-do-i-limit-the-running-time-of-a-bash-script – kennytm 2010-02-02 04:32:55

+0

如果您真的决定使用小于1秒钟,你会想考虑使用一个特殊的驱动程序的应用程序。即使你有一个sleepMilli,在shell的级别上进行调度也可能会导致300 ms的延迟。 – gary 2010-02-02 05:28:52

回答

2

看一看这个脚本:http://www.pixelbeat.org/scripts/timeout 注意小于一秒的超时值上,由于调度延迟等等。注意大部分系统非常荒谬的也是新的coreutils包括了timeout命令,它具有1的分辨率第二。

+0

+1,非常感谢您的脚本,但是...您能澄清为什么超过一秒(!?)的超时是无意义的吗?我一直使用“sleep.1”,并且在接近1/10秒的时候确实回答:我已经完成了以毫微秒为单位的打印日期的测试(无论如何,我清楚地看到了“睡眠1 “和”睡眠1“)。如果调度没有比1秒更好的粒度,那么视频播放/声音播放器如何在Linux上工作?这听起来很奇怪,在今天这个高精度的计时器和时代! (我很困惑) – SyntaxT3rr0r 2010-02-02 16:54:38

+1

通常它很好,但有时候会有延迟,你会错误地超时。从编写在各种高功率但繁忙系统上运行的coreutils测试的经验来看,3秒的超时是发现不触发错误超时的最小时间。 – pixelbeat 2010-02-02 23:54:31