Perl:等待后台进程完成

Perl:等待后台进程完成,perl,backgroundworker,Perl,Backgroundworker,我的问题是,当我运行以下命令时,它会说bash脚本已成功完成。但它不会等待脚本完成,如果它提前退出,它将移动它需要的文件。那么,我做错了什么,它不会等待后台进程完成移动文件 my $pid = fork(); if($pid == -1){ die; } elsif ($pid == 0){ #system(@autoDeploy) or die; logit("Running auto deploy for $bundleApp"); e

我的问题是,当我运行以下命令时,它会说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};

您不需要在
exec
参数中使用
&
,因为您已经在一个fork下运行了。

最简单的错误就是在exec命令行的末尾使用
&
,这意味着您要进行两次fork,并且等待的进程将立即退出

不过,如果您不重定向I/O,也不做任何事情,只是等待
exec
'd进程完成,那么我根本看不出
fork
/
exec
在这里为您服务的目的是什么;这就是
系统的作用

system("./deployer -d $domain.$enviro -e $enviro >> /tmp/$domain.$enviro") 
                and logit("Problem running deployer: $?");
将很容易替换代码的前12行


正如传递过程中的注释一样,
fork
在失败时不会返回-1;它返回
undef
,因此整个检查都是假的。

但它仍然在后台运行吗?我知道如果我这样做,它将等待进程。您想等待进程还是不想等待进程?如果您不想等待流程,为什么原始代码示例有一个
wait
,为什么您会抱怨等待的副作用不起作用?听起来你想等我……如果你在子进程中使用
system
而不是
exec
,你可能想显式地调用
exit
,这样子进程就不会重新运行原本要在父进程中运行的代码了。@Nerdtastic-你调用了
fork
,然后调用了
exec
(或
system
)在子进程中,因此是的,该命令将在后台运行。我如何修改此命令以运行x个部署量?