我的问题是,当我运行以下内容时,它会说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};
答案 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
,因为您已经在分叉下运行。