在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/