在子例程中退出语句后需要更新数据库

时间:2017-03-07 08:18:32

标签: perl

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()之后,由于退出'退出'之后它不会执行任何语句。声明。那么,我如何更新我的数据库状态为'已完成'?

1 个答案:

答案 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