一度に3つのジョブをバックグラウンドで実行するには、bashスクリプトが必要です。バックグラウンドで一定数のジョブを実行するbashスクリプト
私は、次の方法でこれを行うことができます知っている、と説明のために、私は仕事の数が6であると仮定します:
./j1 &
./j2 &
./j3 &
wait
./j4 &
./j5 &
./j6 &
wait
しかし、この方法で、例えば、J2は時間がかかった場合そのj1とj3を実行するには、長い時間実行されている1つのバックグラウンドジョブだけで立ち往生します。
1つのジョブが完了するたびに、bashはキュー内の次のジョブを開始して、任意の時点で3つのジョブの割合が維持されるようにする必要があります。おそらくループを使用して、この代替手段を実装するためのbashスクリプトを書くことは可能ですか?はるかに多くの仕事をする必要があることに注意してください。私はこの代替方法が私に多くの時間を節約することを期待しています。
これは私のスクリプトの草案です。私がbashでスクリプトを書いたことがないので、その正しさを検証し改善することを助けてくれることを願っています。このスクリプトでは、アイデア)を取り、here、here、およびhereから変更されています
for i in $(seq 6)
do
# wait here if the number of jobs is 3 (or more)
while (((($(jobs -p | wc -l))) >= 3))
do
sleep 5 # check again after 5 seconds
done
jobs -x ./j$i &
done
wait
私見を、私はこのスクリプトは、必要な行動をすると思います。しかし、私が間違ってやっている場合や、このアイデアを実装するより良い方法がある場合、私はbashの専門家から知る必要があります。
ありがとうございました。 GNUのxargsので
具体的には*のバージョンのbashですか? –
このようなジョブを管理するには、 'parallel'のようなものを使うことをお勧めします。 – chepner
ところで、 'seq'は一般的に悪い形式です。これはPOSIXで指定されておらず、bashにも組み込まれていないため、特定のシステム上に存在すると考える特別な理由はありません。代わりに[Cスタイルの 'for'ループ](http://wiki.bash-hackers.org/syntax/ccmd/c_for)を使用してください。 –