Bash

在 Bash 中為並行呼叫添加超時

  • January 11, 2020

我正在執行一個簡單的 Bash 腳本,以並行化和自動執行用 Sage MATH 編寫的程序:

#!/bin/bash
for i in {1..500}; do
 echo Spinning up threads...
 echo Round $i
 for j in {1..8}; do
   ../sage ./loader.sage.py &
 done
 wait
done 2>/dev/null

我想添加一個超時,以便在每個執行緒上,5 秒後,

../sage ./loader.sage.py &

將超時,終止執行緒並繼續執行。我該怎麼做呢?如果這是一個菜鳥問題,請提前道歉,我似乎無法正確使用語法。我在 Ubuntu WSL 中執行它。我正在呼叫的程序是用 Python 編寫的,並通過與 Singular 有聯繫的 Sage MATH 解釋器執行。

使用 GNU 並行:

parallel --timeout 5 -j 8 -N0 ../sage ./loader.sage.py ::: {1..4000} 2>/dev/null

這將執行../sage ./loader.sage.py4000 次,一次 8 個作業,每個作業超時 5 秒

從並行手冊頁:

--timeout duration
          Time out for command. If the command runs for longer than duration seconds it will get killed as per --termseq.

注意:此命令將替換您的整個循環。

man timeout——在我的 Linux Mint 中,但你沒有聲明你的作業系統。

timeout 5 ../sage ./loader.sage.py &

添加了一些調試以顯示程序的啟動和停止。您的 sage 啟動似乎可能是磁碟綁定的(可能必須清除記憶體)並且無法使用所有可用的 CPU。由於 Python 是(AFAIK)即時編譯,這可能是一個瓶頸。

#!/bin/bash

for i in {1..3}; do
   echo Spinning up threads...
   echo Round $i
   for j in {1..3}; do
       timeout 1.5 sleep 60 &
   done
   echo "==== $( date '+%H:%M:%S.%N') Before"; jobs
   ps -f
   wait
   echo "==== $( date '+%H:%M:%S.%N') After"; jobs
   ps -f
   echo; timeout 1.0 sleep 0.2
done

引用自:https://unix.stackexchange.com/questions/561594