2014-01-25 69 views
0

我正在寻找在shell中运行命令的最简单方法,如果它在不到一秒的CPU时间内结束,就会将其杀死。喜欢的东西:运行时间受限的shell命令

$ deadline -- slow-foo 
Started fooing... 
[deadline] 1 sec deadline hit, killing and returning -1! 

$ deadline -- quick-foo 
Started fooing... 
Finished fooing! 

基于Linux的解决方案是绰绰有余,但更便携的人的欢迎。

回答

3

Coreutils的有timeout实用程序,做到了这一点,应该可以在大多数Linux发行版:

timeout - 有时间限制

先后为使用何种信号选择运行一个命令和其他一些事情。

+0

哇,这很快! –

3

另外的timeout(1)Mat's answer给出的,如果你想限制CPU time(不空闲时间或实时时间),你可以使用setrlimit(2)系统调用与RLIMIT_CPU(如果超过了CPU时间限制,你进程首先得到一个SIG_XCPU信号 - 它可以捕捉并处理 - 然后是一个SIG_KILL -uncatchable-信号)。此系统调用可在bash(1)中使用ulimit内置。

所以到CPU时间限制为90秒(即1分30秒),键入

ulimit -t 90 
在终端

(假设你的壳是bash;具有zsh使用limit cputime 90,等...) - 然后所有进一步的命令是由限

阅读也启发time(7)signal(7)手册页的限制,并Advanced Linux Programming

1

氏s是快速和肮脏的,并且不需要任何软件包来安装,因此是便携式的:

TIMEOUT=1 
YOURPROGRAM & PID=$! ; (sleep $TIMEOUT && kill $PID 2> /dev/null &) ; wait $PID