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

我的同事告诉我,第一个示例(使用xargs -L1 -P3)“真正并行”运行三个进程,而第二个示例(sh executable_processes.sh使用)&将三个进程作为后台进程运行,但仍然将它们连续发送到后台,即process_1发送到先发送到后台,接下来process_2发送到后台,然后process_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

shell运行的后台进程全部并行运行;你可以通过运行来验证这一点

sleep 10 & sleep 10 & sleep 10 & wait

您将等待十秒(或多一点),而不是三十秒。

所以

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

将使用三个不同的输入并行启动所有三个进程。

如果你想做类似的事情xargs,你可以使用-I

printf "%s\n" {1..3} | xargs -I{} -P3 sh -c "process_{} < input_{}.txt"

相关内容