質問

最大限の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つのグループ:

Simple scheduling

GNU平行ではなくspawns新しいプロセスが終了維持のCpuで活躍することで省時間:

GNU Parallel scheduling

詳細:

しなければいけなかったことの結果以下のソリューション:

while true; do
  wait -n || {
    code="$?"
    ([[ $code = "127" ]] && exit 0 || exit "$code")
    break
  }
done;

この作品:

wait -n 口てる(潜在的に多くの背景に雇用されます。でも評価がtrueのループにまで:

  1. 終了コード 127:最後背景に仕事を成功に終了した.に その場合は、を無視して終了コードと出口のサブシェルコード 0になります。
  2. を背景に仕事に失敗しました。しか口にはサブシェルはその口コードです。

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
}

アイデアは、(子供が出て)バックグラウンドで活動しているどのように多くの子供たちを参照して、この数は下がるまで待つ「ジョブ」を使用することです。子が存在したら、次のタスクを開始することができます。

あなたが見ることができるように、同様の実験を実行しないように余分なロジックのビットもある/複数回のコマンド。私のための仕事は...しかし、このロジックは、(例えば、ファイル作成タイムスタンプ、入力パラメータなどをチェックする。)をスキップまたはさらに向上することができない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top