お待ちbash背景に雇用スクリプトが終了する
-
16-09-2019 - |
質問
最大限のCPU使用(しかったものは、Debian LennyにEC2していま簡単なスクリプト開始雇用並列:
#!/bin/bash
for i in apache-200901*.log; do echo "Processing $i ..."; do_something_important; done &
for i in apache-200902*.log; do echo "Processing $i ..."; do_something_important; done &
for i in apache-200903*.log; do echo "Processing $i ..."; do_something_important; done &
for i in apache-200904*.log; do echo "Processing $i ..."; do_something_important; done &
...
私は非常に満足してここがいくらコードのみ一回実施すべてのループは完了しています。
いきものたちとふれあうことがで制御す。
解決
そのための組み込みコマンドbash
があります。
wait [n ...]
Wait for each specified process and return its termination sta‐
tus. Each n may be a process ID or a job specification; if a
job spec is given, all processes in that job’s pipeline are
waited for. If n is not given, all currently active child pro‐
cesses are waited for, and the return status is zero. If n
specifies a non-existent process or job, the return status is
127. Otherwise, the return status is the exit status of the
last process or job waited for.
他のヒント
使用GNU並列をスクリプトも短くなり、その効率化:
parallel 'echo "Processing "{}" ..."; do_something_important {}' ::: apache-*.log
この実行について、当CPUコアとなるまですべてのファイルが処理されます。
ソリューションは基本的には分割の仕事のグループの前に走っています。こちら32雇用の4つのグループ:
GNU平行ではなくspawns新しいプロセスが終了維持のCpuで活躍することで省時間:
詳細:
- 腕時計のイントロの映像クの紹介https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
- 徒歩によるチュートリアル(男parallel_tutorial).すコマンドライン まいります。
しなければいけなかったことの結果以下のソリューション:
while true; do
wait -n || {
code="$?"
([[ $code = "127" ]] && exit 0 || exit "$code")
break
}
done;
この作品:
wait -n
口てる(潜在的に多くの背景に雇用されます。でも評価がtrueのループにまで:
- 終了コード
127
:最後背景に仕事を成功に終了した.に その場合は、を無視して終了コードと出口のサブシェルコード 0になります。 - を背景に仕事に失敗しました。しか口にはサブシェルはその口コードです。
と set -e
, この保証されるこのスクリプトをもって終了させ早期通口よりコードの他に失敗した背景の仕事です。
これは私の粗溶液である。
function run_task {
cmd=$1
output=$2
concurency=$3
if [ -f ${output}.done ]; then
# experiment already run
echo "Command already run: $cmd. Found output $output"
return
fi
count=`jobs -p | wc -l`
echo "New active task #$count: $cmd > $output"
$cmd > $output && touch $output.done &
stop=$(($count >= $concurency))
while [ $stop -eq 1 ]; do
echo "Waiting for $count worker threads..."
sleep 1
count=`jobs -p | wc -l`
stop=$(($count > $concurency))
done
}
アイデアは、(子供が出て)バックグラウンドで活動しているどのように多くの子供たちを参照して、この数は下がるまで待つ「ジョブ」を使用することです。子が存在したら、次のタスクを開始することができます。
あなたが見ることができるように、同様の実験を実行しないように余分なロジックのビットもある/複数回のコマンド。私のための仕事は...しかし、このロジックは、(例えば、ファイル作成タイムスタンプ、入力パラメータなどをチェックする。)をスキップまたはさらに向上することができない。
所属していません StackOverflow