我有一个文件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
我的同事告诉我,第一个示例(使用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"