我对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
的每次出现,但等待所有这些完成后再继续进行下一个外循环迭代。根据{{3}}的答案,我尝试了以下内容:
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
都像以前一样立即启动。
我做错了什么?我能做些什么来实现我的目标?感谢。
答案 0 :(得分:3)
()
调用一个子shell,然后调用find / myprogram,这样你就可以处理“孙子”进程。你不能等到孙子孙女,只有直系后代(又名孩子)。
答案 1 :(得分:1)