題 使用bash運行腳本並提供終止時間[重複]


這個問題在這裡已有答案:

是否可以使用終止時間從bash(例如python)運行腳本,這意味著如果此腳本運行的時間超過X秒,則終止它?


6
2017-07-01 18:51


起源




答案:


是的,可以運行一個帶有超時的bash腳本來終止它。你可以這樣做:

1.使用 超時 :

它運行帶有時間限制的命令。一般語法包括:

timeout signal duration command/script arguments

其中:

  • signal是信號名稱或相應的號碼。看到 男人7信號
  • 持續時間是以數字形式指定的超時,後綴為 s 幾秒鐘 m 幾分鐘, h 用了幾個小時 , d 持續數天。
  • 默認值為秒,僅指定數字時。舉個例子說你想在2分鐘後終止你的腳本,然後:

    timeout 2m /path/to/script arg1 arg2
    
  • NOTE :默認超時信號是 SIGTERM 一些進程沒有終止。在那種情況下,我們需要使用 SIGKILL 信號殺死這個過程。

        timeout -s KILL 2m /path/to/script arg1 arg2
    

    要么

        timeout -k 30 2m /path/to/slow-command arg1 arg2
    

    在這種情況下,超時首先發送 SIGTERM 初始超時2分鐘後發出信號。然後,等待30秒的另一個超時並發送一個 SIGKILL 如果它還在運行的話。

沒有 timeout 命令:

好吧,有很多選擇或解決方法,如果由於某種原因你無法使用 timeout。這些是 :

  1. 條件 sleep 然後 kill :

       /path/to/script arg1 arg2 & sleep 2m ; kill $!
    
  2. Perl Alarms(這可以在順序腳本中使用。):

       perl -e "alarm 120; exec @ARGV" "/path/to/script arg1 arg2"
    
  3. 運用 期望 命令:

       time_out=120
       command="/path/to/script arg1 arg2"
    
       expect -c " set echo \"-noecho\";
                   set timeout $time_out;
                   spawn -noecho $command;
                   expect timeout { exit 1 } eof { exit 0 } "
    

隨意添加更多細節。


5
2017-07-01 20:42