这是在后台启动多个顺序处理的正确方法吗?
for i in {1..10}; do
for j in {1..10}; do
run_command $i $j;
done &
done;
对于给定的 ,所有内容j
都应该依次处理i
,但所有内容都i
应该同时处理。
答案1
你所拥有的外循环基本上是
for i in {1..10}; do
some_compound_command &
done
some_compound_command
这将在后台启动 10 个并发实例。它们将尽可能快地启动,但不会完全“同时”(即,如果some_compound_command
需要非常时间很短,那么第一个很可能会在最后一个开始之前完成)。
碰巧是一个循环这一事实some_compound_command
并不重要。这意味着您显示的代码是正确的内部j
循环的迭代将按顺序运行,但内部循环的所有实例(外部i
循环的每次迭代一个)将同时启动。
唯一要记住的是每个后台作业都将在子 shell 中运行。这意味着内部循环的一个实例中对环境所做的更改(例如,对 shell 变量值的修改、使用 更改当前工作目录cd
等)在该特定后台作业之外将不可见。
您可能想要在循环之后添加一条wait
语句,只是为了等待所有后台作业实际完成,至少在脚本终止之前:
for i in {1..10}; do
for j in {1..10}; do
run_command "$i" "$j"
done &
done
wait
答案2
如果你有 GNU Parallel 你会这样做:
parallel -j0 'for j in {1..10}; do run_command {} $j; done' ::: {1..10}
好处之一是并行运行的输出run_commands
不会混合。