我在一个目录中有 100 个文件,我想分几个步骤处理每个文件,而第 1 步很耗时。所以伪代码是这样的:
for filename in ~/dir/*; do
run_step1 filename >${filename}.out &
done
for outfile in ~/dir/*.out; do
run_step2 outfile >${outfile}.result
done
我的问题是如何检查给定输入文件的第 1 步是否已完成。我曾经在 C# 中使用 threads.join,但不确定 bash shell 是否具有等效项。
最佳答案
看起来你想要:
for filename in ~/dir/*
do
(
run_step1 $filename >${filename}.out
run_step2 ${filename}.out >${filename}.result
) &
done
wait
这会在单独的子 shell 中处理每个文件,首先对每个文件运行第 1 步,然后运行第 2 步,但会并行处理多个文件。
您唯一需要担心的问题是确保您不会尝试并行运行太多进程。您可能需要考虑 GNU parallel
。
您可能想编写一个简单的脚本(doit.sh
,也许):
run_step1 "$1" > "$1.out"
run_step2 "$1.out" > "$1.result"
然后从并行
调用该脚本,每次调用一个文件。
关于linux - 并行运行 bash shell 并等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23135759/