在UNIX/Linux Shell中同时运行一系列命令的更好方法?

Mar*_*ton 3 unix linux bash shell multithreading

我想知道在UNIX/Linux中同时执行一系列命令的好习惯.假设我有一个程序program_a,它需要一个参数.我已经在文件中逐行存储了参数.所以我写道:

while read line
do
    ./program_a line > $line.log 2>&1
done < parameter_file
Run Code Online (Sandbox Code Playgroud)

问题是program_a的执行需要很长时间.因为每个参数的program_a的每次执行都是独立的,所以我认为这些执行可以同时运行.我不知道它是否涉及多线程或其他技术.以下是我的想法.使用&在后台运行每个执行.

while read line
do
    ./program_a line $line.log 2>&1 &
done < parameter_file
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来启动多个任务?

Ult*_*nct 5

您知道xargs可以并行启动任务吗?查看-P -n参数!

一个例子:

xargs -P 4 -n 1 ./program_a < parameter_file
Run Code Online (Sandbox Code Playgroud)

这将开始program_a处理每一行(n = 1)的4个(P = 4)实例.您可能必须program_a在shell脚本或其他内容中进行换行,以便可以正确地重定向子进程stdout和stderr.

这比将进程放到backgroud更好:假设输入文件中有1000行,显然你不希望启动1000个进程.Xargs允许您将其视为一个队列,P每个工作者都会n从中消耗和处理项目.