2011-05-31 29 views
1

如何限制進程在Bash中小於1秒的CPU時間?我使用的版本4.1.5(1),如果我輸入ulimit -t 0.5 command,我得到:在Bash中限制進程爲0.5s

-bash: ulimit: 0.5: invalid number 

我使用ulimit -t 1 command作爲一個不完美的替代品,但由於技術原因,我並不需要打擾你,我非常類似command在CPU已經有半秒鐘或者稍微少一點時會停止。

Linux特定的答案會很好。

+0

我忘了說這是在Bash編寫shell腳本的上下文中。 – 2011-05-31 15:50:12

回答

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_*,或者僅首先測試timer_*並在可用的情況下使用它們。

請注意,如果您使用這些功能設置了0.5秒的超時時間,則它們保證最少經過時間爲0.5秒 - 但由於計劃問題,它可能會比任意時間長。請注意,有一個timer_getoverrun()來幫助確定溢出時間。

+1

此解決方案似乎在經過一段固定的時間後發出信號,而不是固定的CPU時間。 OP在0.5秒的CPU時間後要求提供一個sginal。 – 2011-05-31 16:18:18

+0

@Rob:我想明天飛往月球 - 可悲的是,目前還不可行。所用時間是以亞秒精度提供的CPU時間的最佳近似值。 – 2011-05-31 16:50:26

+0

**我知道。 **你懂的。但是你的回答並沒有說明OP。附:鏈接到您[以前發佈的SO代碼](http://stackoverflow.com/questions/601543/command-line-command-to-auto-kill-a-command-after-a-certain-amount-of-時間/ 601576#601576)會有幫助。 – 2011-05-31 17:19:34

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. 
+0

downvote的任何原因? – 2011-05-31 16:18:29