Bashでパラレルコールのタイムアウトを追加する

Bashでパラレルコールのタイムアウトを追加する

私はSage MATHで書かれたプログラムの実行を並列化し自動化するために単純なBashスクリプトを実行しています。

#!/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インタプリタを介して実行されました。

答え1

GNU並列処理を使用する:

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

../sage ./loader.sage.pyこれは一度に8つのジョブを4000回実行し、各タイムアウトは5秒です。

並列マニュアルページから:

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

注:このコマンドはループ全体を置き換えます。

答え2

man timeout - 私のLinux MintはOSを宣言しませんでした

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

プロセスの開始と停止を示すために、いくつかのデバッグを追加しました。 Sageの起動時にディスクが制限されている(キャッシュを消去する必要があるかもしれません)、利用可能なCPUはすべて利用できないようです。 (私が知っている限り)Pythonはタイムリーにコンパイルされるため、ボトルネックが発生する可能性があります。

#!/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

関連情報