4

我已经查看了相关主题,但没有找到答案。

这是我的问题:

我正在尝试将这些我通常不在 for 循环中运行的命令放入两个单独的 for 循环中

原始命令:

command1 &
command2 &

wait

command 3

这显然在后台启动了两个命令,并且在 BOTH 都完成后,它启动了命令 3

现在这里有我的 for 循环脚本:

file1=directory1/*.txt

for i in $file1;

do

command1 ${i} > ${i}.test & # I know, it will generate files like ".txt.test". It's ok.

done &


file2=directory2/*.txt

for i2 in $file2;

do

command1 ${i2} > ${i2}.test & 

done &

wait

command3

现在我的脚本中有一些错误,因为有时在执行命令 3 时,即使我放了“等待”,我也可以从 command1 或 command2 找到一些工作。

我尝试了不同的选项,例如没有 & 的第二个“完成”。我也试过两个等待..但我所做的一切......我把所有的工作都搞砸了:(

我的错误在哪里(请......礼貌:P)?

谢谢

法比奥

4

2 回答 2

1

保存两个“for”循环,但从它们中删除所有“&”,作为单独的文件:loop1,loop2。chmod a+rx loop1 loop2; 并执行:

loop1 &
loop2 &
wait
command3

我不知道“done &”的行为,最好不要使用它。
您的代码同时执行所有内容。我假设你想要 2 个线程。

编辑:单脚本解决方案:

script1=`mktemp /tmp/.script.XXXXXX`;
cat >$script1 <<END
for i in directory1/*.txt; do
  command1 ${i} > ${i}.test;
done 
END

script2=`mktemp /tmp/.script.XXXXXX`;
cat >$script2 <<END
for i in directory2/*.txt; do
  command1 ${i} > ${i}.test;
done 
END

chmod u+rx $script1 $script2
$script1 &
$script2 &
wait;
command3

/bin/rm $script1 $script2
于 2013-03-01T17:02:41.453 回答
0

您无需在每次完成后放置与号 (&),您只需将其放在每个命令之后,两个循环中的所有作业都将被放入后台,只需等待即可。

for i in $( seq 1 3 ); do
    command1 "$i" > "$i.test" &
done

for i in $( seq 4 6 ); do
    command2 "$i" > "$i.test" &
done

wait

command3

另一种方法是通过使用来存储每个后台进程的 pid $!,就像这样

pid=""
command & pid="$pid $!"
wait $pid
于 2013-06-12T11:16:59.403 回答