2

UNIX (bash シェル) クラスター コンピューターで実行する次のジョブ (例として) があります。

### job1
mkdir file01
cp *.map  flex01
date > out
cd ..

### job2
mkdir file02
cp *.map  flex02
date > out
cd ..

### job3
mkdir file03
cp *.map  flex03
date > out
cd ..

### job4
mkdir file04
cp *.map  flex04
date > out
cd ..

これらのジョブを送信すると、1 つずつ実行されます。しかし、それらを並行して実行したいということは、ジョブ 1 からジョブ 4 までがバックグラウンドで同時に実行されているということです。

どうすればできますか?簡単な質問で申し訳ありませんが、私はunixが初めてです。

4

3 に答える 3

2

コマンドはcd良い考えではないようです。cdあなたはディレクトリにいません。おそらく、日付情報を常に上書きするのではなく、出力ファイルに追加することもできます。また、作成したばかりのディレクトリにマップ ファイルをコピーする可能性が高くなります。したがって、次のように書くことができます。

(mkdir flex01; cp *.map flex01; echo "Job 1: $(date)" >> out) &
(mkdir flex02; cp *.map flex02; echo "Job 2: $(date)" >> out) &
(mkdir flex03; cp *.map flex03; echo "Job 3: $(date)" >> out) &
(mkdir flex04; cp *.map flex04; echo "Job 4: $(date)" >> out) &

wait

これにより、コマンドの各シーケンスが個別のバックグラウンド ジョブとして実行され、すべてが完了するまで待機してから続行します。このタスクにループを使用することも検討できます。

for n in $(seq 1 4)
do
    (mkdir flex0$n; cp *.map flex0$n; echo "Job $n: $(date)" >> out) &
done

mkdir -p flex01既に存在するディレクトリを作成しようとしたときにエラー メッセージが表示されないように、使用を検討することもできます。(または、エラーをテストして存在する場合はコピーしないか、実行する前に存在をテストするmkdirか、既に存在する場合はコピーする前に消去するか、または ...)

于 2012-05-20T03:29:05.163 に答える
0

GNU Parallel http://www.gnu.org/software/parallel/がインストールされている場合は、次のことができます。

seq 4 | parallel 'mkdir flex0{}; cp *.map flex0{}; echo "Job {}: $(date)" >> out'

CPU コアごとに 1 つのプロセスを実行します。

GNU Parallel は次の方法で簡単にインストールできます。

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

詳細については、GNU Parallel の紹介ビデオをご覧ください: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2012-05-22T18:16:44.613 に答える
0

&コマンドラインに を追加するだけで、各コマンドを開始してバックグラウンドに置くことができます。すなわち、

date > out &

各コマンドを別々のディレクトリで開始するため、出力をキャッチするファイルに同じ名前を使用しても問題はありません。

更新: 以下のコメントに記載されている追加情報に基づいて、問題は別の場所にあると思われます。サイトのヘルプデスクに連絡するか、サイト固有のサンプル スクリプト ファイルを調べて、並列ジョブを設定するのに役立てることをお勧めします。あなたが働いている環境にとって最も効果的な方法です。

于 2012-05-20T02:20:03.190 に答える