Bash
在 Bash 中為並行呼叫添加超時
我正在執行一個簡單的 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.py
4000 次,一次 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