代码之家  ›  专栏  ›  技术社区  ›  Colin Wood

Perl:等待后台进程完成

  •  2
  • Colin Wood  · 技术社区  · 14 年前

    我的问题是,当我运行以下命令时,它会说bash脚本已经成功完成。但它不会等待脚本完成,如果它提前退出,它将移动所需的文件。那么,我做错了什么,以至于它不会等待后台进程完成移动文件?

    my $pid = fork();
        if($pid == -1){
         die;
        } elsif ($pid == 0){
         #system(@autoDeploy) or die;
         logit("Running auto deploy for $bundleApp");
         exec("./deployer -d $domain.$enviro -e $enviro >> /tmp/$domain.$enviro &") 
                        or logit("Couldnt run the script.");
        }
        while (wait () != -1){
    
        }
        logit("Ran autoDeploy");
    
        logit("Moving $bundleApp, to $bundleDir/old/$bundleApp.$date.bundle");
        move("$bundleDir/$bundleApp", "$bundleDir/old/$bundleApp.$date.bundle");
        delete $curBundles{$bundleApp};
    
    2 回复  |  直到 14 年前
        1
  •  5
  •   hobbs    14 年前

    你做错的最简单的事情就是用 & 在exec命令行的末尾——这意味着您要分叉两次,并且您要 wait 打开将立即退出。

    我真的不知道是什么目的 fork / exec 不过,如果您不重定向I/O,而只是等待 执行程序 完成的过程;这就是 system 是为了。

    system("./deployer -d $domain.$enviro -e $enviro >> /tmp/$domain.$enviro") 
                    and logit("Problem running deployer: $?");
    

    很容易替换代码的前12行。

    就像路过的便条, 不返回-1;失败时返回 undef 所以整个检查都是伪造的。

        2
  •  1
  •   Hasturkun    14 年前

    你不需要使用 & 在你 exec 参数,因为您已经在分叉下运行。