web-dev-qa-db-ja.com

Bashの並列化された呼び出しにタイムアウトを追加する

SageMATHで記述されたプログラムの実行を並列化および自動化するために実行している単純な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 &

タイムアウトし、スレッドを強制終了し、実行を続行します。どうすればこれを行うことができますか?これが初心者の質問である場合は、事前にお詫び申し上げます。構文を正しく理解できないようです。私はこれをUbuntuWSLで実行しています。私が呼び出しているプログラムはPythonで記述されており、Singularと連携するSageMATHインタープリターを介して実行されます。

3
Alex Williams

GNU Parallel:

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.

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

6
jesse_b

man timeout-私のLinuxMintでは、OSを宣言していません。

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
0
Paul_Pedant