sub Processing {
.
.
.
.
foreach my $hProc (@{ $hRes->{'List'} }) {
.
.
elsif($hProc->{BATCH_TYPE} =~ /^(abc)$/i) {
# All is Ok. Need to launch new process.
if ($pid = fork) { #for parent process
sleep 1; #wait for child process
$oLogger->info("process launched.");
$hActions->{xyz}--;
AddAction ($id_auth,'Success. Batch process','',undef,undef,$hProc->{SESSION},"$hProc->{BATCH_TYPE} Launched successfully",undef);
next
} elsif (defined $pid) { #for child process
if($hProc->{STATUS} eq 'Not started') {
my $temp = UpdateProcess( { STATUS=>'In Processing',START_TS=>'CURRENT_TIMESTAMP' }, { id=>$hProc->{ID} } );
next unless $temp;
}
$cmdStr = join ' ', $scriptName, $Parameters, $Output, '-archiver=gzip';
$cmdStr .= "; chown $Owner" if $Owner;
$cmdStr .= "; chmod $Permissions" if $Permissions;
goToScript("perl $cmdStr >/dev/null 2>>$err_to_file_ecm");
} else {
$oLogger->error("!process launch FAILED. FORK could not create child process");
}
}
sub goToScript {
my ($script) = @_;
print "$script\n" if $trace;
exec($script);
exit;
大家好,我想从“处理中”更新我的数据库的状态'到达'已完成'如上所述。但问题是在控制转到子goToScript()之后,由于退出'退出'之后它不会执行任何语句。声明。那么,我如何更新我的数据库状态为'已完成'?
答案 0 :(得分:4)
你的代码很乱,你真的不应该那样exit
。如果您执行exec
,则其他程序($script
)将永远不会返回。它刚刚开始,你的程序忘了它。那么你怎么知道已完成?
我摆脱exit
,将goToScript
重命名为startScript
,然后在调用该函数后进行更改。
如果您真的坚持按现在的方式进行,可以使用END
块。在程序结束时,在清理期间会调用它。这样,您就可以更新您的状态。你不能说出你需要的东西,但我想你想打电话给UpdateProcess
。
elsif (defined $pid) { #for child process
# ...
END {
UpdateProcess(
{ STATUS=>'Completed',START_TS=>'CURRENT_TIMESTAMP' },
{ id=>$hProc->{ID} }
);
}
goToScript("perl $cmdStr >/dev/null 2>>$err_to_file_ecm");
}
您需要在代码中间定义END
块,因为您需要使用词法范围$hProc
,因为它可以保存您的ID。
有关END
的详细信息,请参阅perlmod。