在bash中,如何将进程的cpu时间限制在1s以内?我使用的是4.1.5(1)版,如果键入ulimit -t 0.5 command,则会得到:

-bash: ulimit: 0.5: invalid number

我使用ulimit -t 1 command作为一个不完美的替代品,但是出于技术原因,我不需要麻烦您,我非常希望command在拥有CPU半秒或更少一点之后被停止。
一个特定于linux的答案就可以了。

最佳答案

正如其他人所说,使用标准的内置bash命令是做不到的。
可以创建自己的命令来限制命令的运行时间(与命令使用的实际CPU时间不同;另请参阅Rob中的注释,谢谢!)。我以前曾在socode上发布过在经过整数秒后执行超时(因此这不是对您的问题的直接回答)。但是,您可以(相当)轻松地调整代码,以便在经过的时间和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()可以帮助确定溢出的时间。

关于linux - 在Bash中将进程限制为0.5秒,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6189341/

10-11 01:32