【发布时间】:2011-12-23 20:02:15
【问题描述】:
我有一个关于 shell 脚本中的并行处理的问题。我有一个程序my
Program,我希望在循环中的循环中运行多次。这个程序基本上是这样的:
MYPATHDIR=`ls $MYPATH`
for SUBDIRS in $MYPATHDIR; do
SUBDIR_FILES=`ls $MYPATH/$SUBDIRS`
for SUBSUBDIRS in $SUBDIR_FILES; do
find $MYPATH/$SUBDIRS/$SUBSUBDIRS | ./myProgram $MYPATH/$SUBDIRS/outputfile.dat
done
done
我想做的是利用并行处理。所以我尝试了这个中间线以立即启动所有myPrograms:
(find $MYPATH/$SUBDIRS/$SUBSUBDIRS | ./myProgram $MYPATH/$SUBDIRS/outputfile.dat &)
但是,这同时开始了对 myProgram 的所有 300 次左右的调用,导致 RAM 问题等。
我想做的是在内部循环中并行运行每个出现的myProgram,但在继续下一个外部循环迭代之前等待所有这些完成。根据this question 的回答,我尝试了以下方法:
for SUBDIRS in $MYPATHDIR; do
SUBDIR_FILES=`ls $MYPATH/$SUBDIRS`
for SUBSUBDIRS in $SUBDIR_FILES; do
(find $MYPATH/$SUBDIRS/$SUBSUBDIRS | ./myProgram $MYPATH/$SUBDIRS/outputfile.dat &)
done
wait $(pgrep myProgram)
done
但我收到以下警告/错误,重复多次:
./myScript.sh: line 30: wait: pid 1133 is not a child of this shell
...所有myPrograms 都像以前一样立即启动。
我做错了什么?我可以做些什么来实现我的目标?谢谢。
【问题讨论】:
-
()调用一个子shell,然后调用 find/myprogram,因此您正在处理“孙子”进程。你不能等孙子,只能等直系后裔(也就是孩子)。 -
我明白了。我可以更改我的代码以使其成为子代而不是孙代吗?
-
是的,我已经取出了括号,它似乎正在工作。 Megaparty,发表您的评论作为答案,您就赚到了。
标签: bash shell parallel-processing wait