2013-02-28 19 views
3

我已经看了相关的主题,但我没有找到答案。bash不同循环在背景中使用&并等待

这里是我的问题:

我试图把我通常在for循环中运行,而不是这些命令为两个单独的for循环

原来的命令:

command1 & 
command2 & 

wait 

command 3 

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

现在,这里是我的循环脚本:

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中找到一些作业,即使我放置了“等待”。

我试过不同的选项,如第二个“完成”没有&。我也试过我做两wait..but一切......我搞砸了所有的工作:(

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

谢谢

法比奥

回答

1

保存这两个 “for” 循环,但他们删除所有 “&”,作为单独的文件:LOOP1,环2存取权限chmod a + RX LOOP1环2;和执行:

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 
+0

谢谢拉迪,但我一直在寻找一个“全合一”解决方案只需一个脚本。 – fabioln79 2013-03-06 15:26:27

+0

我已经添加了单个脚本解决方案。 – 2013-03-13 17:32:38

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