Perl:等待后台进程完成
我的问题是,当我运行以下命令时,它会说bash脚本已成功完成。但它不会等待脚本完成,如果它提前退出,它将移动它需要的文件。那么,我做错了什么,它不会等待后台进程完成移动文件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
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个部署量?