xargs -Pはバックグラウンドプロセスを実行しますか? &を使うのとどう違うの?

xargs -Pはバックグラウンドプロセスを実行しますか? &を使うのとどう違うの?

次のファイルがあります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_1process_2とは実行権限を持つスクリプトですが、 と とprocess_3同じ操作を行い、端末で次のコマンドを実行しました。process_1.shprocess_2.shprocess_3.sh

sh executable_processes.sh

私の同僚は、最初の例(using xargs -L1 -P3)が3つのプロセスを「実際に並列」で実行するのに対して、2番目の例(sh executable_processes.shusing)は&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_1cat

使用法が&異なる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"

おすすめ記事