Perl:等待后台流程完成

时间:2010-08-05 14:06:43

标签: perl backgroundworker

我的问题是,当我运行以下内容时,它会说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 个答案:

答案 0 :(得分:5)

你做错的最简单的事情就是在exec命令行的末尾使用& - 这意味着你要分两次,而你正在wait进行的过程将立即退出。

我实际上并没有看到fork / exec在这里为你服务的目的,但是,如果你没有重定向I / O而不做任何事情,只需等待{{ 1}}'过程完成;这就是exec的用途。

system

将很容易替代代码的前十二行。

正如传递中的注释一样,system("./deployer -d $domain.$enviro -e $enviro >> /tmp/$domain.$enviro") and logit("Problem running deployer: $?"); 在失败时不会返回-1;它返回fork,因此整个检查完全是假的。

答案 1 :(得分:1)

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