【问题标题】:Parallel processing in shell scripting, 'pid is not a child of this shell'shell脚本中的并行处理,'pid不是这个shell的孩子'
【发布时间】: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


【解决方案1】:

() 调用子shell,然后调用find/myprogram,因此您正在处理“孙子”进程。你不能等孙子,只能等直系后裔(也就是孩子)。

【讨论】:

    【解决方案2】:

    您可能会发现GNU Parallel 很有用。

    parallel -j+0 ./myProgram ::: $MYPATH/$SUBDIRS/*
    

    这将像 CPU 内核一样并行运行 ./myProgram

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2013-10-28
      • 2011-10-21
      • 2014-05-16
      相关资源
      最近更新 更多