运行时间受限的shell命令

时间:2014-01-25 13:39:07

标签: linux shell

我正在寻找在shell中运行命令的最简单方法,如果它不会在不到一秒的CPU时间内结束,则将其终止。类似的东西:

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

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

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

3 个答案:

答案 0 :(得分:3)

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

  

timeout - 运行带有时间限制的命令

可以选择使用哪种信号以及其他一些信息。

答案 1 :(得分:3)

timeout(1)中提供的Mat's answer外,如果您想限制CPU time(不是空闲时间或真实时间),您可以将setrlimit(2)系统调用与RLIMIT_CPU一起使用(如果超出CPU时间限制,您的进程首先获得SIG_XCPU信号 - 它可以捕获并处理 - 以及稍后一个SIG_KILL - 可启动信号)。这个系统调用在bash(1)中可用ulimit内置。

所以将CPU时间限制为90秒(即1分30秒)类型

 ulimit -t 90
终端中的

(假设您的shell为bash; zsh使用limit cputime 90等等) - 然后所有其他命令都受到该限制的约束

另请阅读有用的time(7)signal(7)手册页以及Advanced Linux Programming

答案 2 :(得分:1)

这很快,很脏,不需要安装任何软件包,因此可移植:

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