次のファイルがありますprocesses.txt
。
process_1.sh
process_2.sh
process_3.sh
端末で次のコマンドを実行します。
cat processes.txt | xargs -L1 -P3 sh
executable_processes.sh
次のスクリプトがある場合の違いは何ですか?
process_1 &
process_2 &
process_3 &
wait
ここでprocess_1
、process_2
とは実行権限を持つスクリプトですが、 と とprocess_3
同じ操作を行い、端末で次のコマンドを実行しました。process_1.sh
process_2.sh
process_3.sh
sh executable_processes.sh
私の同僚は、最初の例(using xargs -L1 -P3
)が3つのプロセスを「実際に並列」で実行するのに対して、2番目の例(sh executable_processes.sh
using)は&
3つのプロセスをバックグラウンドプロセスとして実行しますが、まだバックグラウンドで転送し続けているとprocess_1
述べました。最初の背景、次のprocess_2
背景、そしてprocess_3
バックの背景。だから彼は私が最初の例を使うことを好んだ。しかし、最初のアプローチの問題は、3行が次のxargs -L1 -P3
場合にどのprocesses.txt
ように使用されるのかわからないことです。
cat input_1.txt | process_1
cat input_2.txt | process_2
cat input_3.txt | process_3
processes.txt
次のようにファイルを変更するとします。
input_1.txt | process_1
input_2.txt | process_2
input_3.txt | process_3
その後実行
cat processes.txt | xargs -L1 -P3 cat
エラーが発生します。
cat: '|': No such file or directory
cat input_1.txt
まず、実行して出力をprocess_1
ギターにパイプできるようにしたいです。ただし、およびはパラメータとして扱われますinput_1.txt
。|
process_1
cat
使用法が&
異なるxargs -P
場合は、以下を含むスクリプトを実行する方が合理的です。
cat input_1.txt | process_1 &
cat input_2.txt | process_2 &
cat input_3.txt | process_3 &
答え1
シェルで実行されるバックグラウンドプロセスはすべて並列に実行されます。これを実行して確認できます。
sleep 10 & sleep 10 & sleep 10 & wait
30秒ではなく10秒(またはもう少し)待ちます。
だから
process_1 < input_1.txt &
process_2 < input_2.txt &
process_3 < input_3.txt &
または
for i in {1..3}; do "process_$i" < "input_$i.txt" & done
3つのプロセスはすべて、3つの異なる入力を使用して並列に開始されます。
同様のタスクを実行するには、xargs
次のものを使用できます-I
。
printf "%s\n" {1..3} | xargs -I{} -P3 sh -c "process_{} < input_{}.txt"