予想される実行時間を超えると、GNU並列プロセスを中断できますか?たとえば、すべての処理を監視するハンドラがあります。
while [ -n "${ids[0]}" ] ; do
printf 'Processing ID: %s\n' "${ids[@]}" >&2
/usr/bin/time -f "$timefmt" \
printf '%s\n' "${ids[@]}" | parallel --jobs 0 recon-all -s {.} -all -
qcache -parallel -openmp 8
n=$(( n + 1 ))
ids=( "${all_ids[@]:n*4:4}" ) # pick out the next eight IDs
done
何らかの理由で並列偵察プロセスを完了できない患者もいます(数日間実行することができますが、これは正常ではありません)。コマンドがループ内で別のグループを実行するように、並列実行時間を9時間に制限できますか?
答え1
あなたが探している --timeout
。
あなたはそれをすることができます、--timeout 9h
またはあなたはそれをすることができます--timeout 1000%
。最後の項目は、ジョブが成功するのにかかる中央値の時間を測定し、中央値が与えられると、中央値の実行時間の1000%に対応する時間制限を計算します。
パーセンテージの使用の良い点は、一般的な状況で計算プログラムがより速くなったり遅くなったりしても、タイムアウトを変更する必要がないことです。
実際に確認してください:
parallel --timeout 300% 'sleep {}; echo {}' ::: 100 2 3 1 50 2 3 1 2 1 3 2 1 4 2 1 2 3
# Compute program gets 10 times faster
parallel --timeout 300% 'sleep {=$_ /= 10 =}; echo {}' ::: 100 2 3 1 50 2 3 1 2 1 3 2 1 4 2 1 2 3
中央値(平均ではない)ランタイムは、正常に完了したジョブの中央値に基づいて測定されます(最小値は3つです)。したがって、8つのジョブがあり、そのうち5つが無限のジョブの場合、ランタイムが中央値タイムアウトの一定の割合に達すると、ジョブは終了します。
parallel --timeout 300% 'sleep {}; echo {}' ::: 1 2 1 2 100 2 1 2
これは、最初の操作が中断された場合でも機能します。
parallel --timeout 300% 'sleep {}; echo {}' ::: 100 2 1 2 1 2 1 2
動作しない唯一のケースは、すべてのタスクが最初のタスクで停止した場合です。
parallel -j4 --timeout 300% 'sleep {}; echo {}' ::: 100 100 100 100 1 2 1 2