我正在寻找在shell中运行命令的最简单方法,如果它不会在不到一秒的CPU时间内结束,则将其终止。类似的东西:
$ deadline -- slow-foo
Started fooing...
[deadline] 1 sec deadline hit, killing and returning -1!
$ deadline -- quick-foo
Started fooing...
Finished fooing!
基于Linux的解决方案绰绰有余,但欢迎使用更便携的解决方案。
答案 0 :(得分:3)
答案 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