在Bash中将进程限制为0.5秒

时间:2011-05-31 14:44:19

标签: linux bash shell unix

如何在Bash中将进程限制为少于1秒的CPU时间?我使用的是版本4.1.5(1),如果我输入ulimit -t 0.5 command,我会得到:

-bash: ulimit: 0.5: invalid number

我使用ulimit -t 1 command作为一个不完美的替代品,但由于技术原因我不需要打扰你,我非常希望{c}在它拥有CPU之后停止半秒或者可能少一点。

特定于Linux的答案可以。

3 个答案:

答案 0 :(得分:5)

也许你不能。底层系统调用(setrlimit)仅提供全秒解析。

 RLIMIT_CPU
          CPU time limit in seconds.  When the process  reaches  the  soft
          limit, it is sent a SIGXCPU signal.  The default action for this
          signal is to terminate the process.  However, the signal can  be
          caught,  and the handler can return control to the main program.
          If the process continues to consume CPU time, it  will  be  sent
          SIGXCPU  once  per  second  until  the hard limit is reached, at
          which time it is sent SIGKILL.

答案 1 :(得分:4)

正如其他人所说,你无法使用标准的内置Bash命令。

可以创建自己的命令来限制命令的已用时间(与命令使用的实际CPU时间不同;另请参阅Rob的注释,感谢!)。我之前在SO code上发布了在整数秒后经历超时(因此它不能直接解决您的问题)。但是,您可以(相当)轻松地调整代码,以便在经过的时间和POSIX工具上使用亚秒级分辨率。核心界面是:

timeout -t time [-s signal] cmd [args ...]

为了满足您的要求,它只需要识别亚秒次并调用适当的函数;它对内部的影响远远超过外部。

理论上(根据POSIX 2008),您应该使用timer_create()timer_settime()timer_gettime()函数。这些提供了在计时器到期时应该生成哪个信号的详细控制等。但是,并非所有系统都提供它们(例如,MacOS X 10.6.7没有记录它们)。它们使用标题<time.h><signal.h>以及struct itimerspec(和struct sigevent)。

但是,在短期内,您可能需要使用函数getitimer()setitimer(),而POSIX 2008标记为过时(但在MacOS X 10.6.7上可用)。它们使用标题<sys/time.h>struct itimerval

为了便携,您可能需要自动配置您的程序来处理这两个问题;您可能还需要处理Windows(毫无疑问会提供替代界面)。如果两个精细分辨率信令计时器系统都不可用,您可能会回退到alarm()和全秒粒度时序。如果两者都存在,请选择timer_*函数*itimer函数 - 或者只是首先测试timer_*并在可用时使用它们。

请注意,如果使用这些功能设置0.5秒的超时,它们保证最小经过时间为0.5秒 - 但由于计划问题,它可能比任意时间长。请注意,有一个timer_getoverrun()可以帮助确定超限的持续时间。

答案 2 :(得分:3)

你做不到。基础setrlimit调用的粒度为秒。