为什么不总是在perl中调用exit?

时间:2013-03-15 07:26:26

标签: perl exit

我有一个用于设置远程主机的perl脚本。如果出现问题,这就是它的中断处理程序:

sub interrupt
{
    $SIG{'__DIE__'} = '';
    my $signal = shift;
    print STDERR "Error $SELF_NAME: Bootstrapping of host '$REMOTE_HOST' is interrupted with error '$signal', deleting remote temporary directory $REMOTE_TEMP_DIR.\n";
    remote_exec("perl -e \"use File::Path; rmtree('$REMOTE_TEMP_DIR');\"", $REMOTE_HOST, $REMOTE_EXEC_METHOD, $REMOTE_EXEC_PORT, $USERNAME, $PASSWORD, 0, 1);
    exit 1;
}

并且在需​​要时始终调用此处理程序。所以我可以在STDERR中看到有关中断引导的错误。但是exit 1;未被调用,脚本返回exit_code = 0但是如果我在处理程序的最后两行之间添加此行print STDERR "After remote_exec and before exit";,它可以正常工作(即返回exit_code = 1)。

注意:remote_exec只在内部调用system($COMMAND),因为我正在本地主机上测试它。

更新

添加有关如何调用脚本的一些详细信息:

我从我的C ++程序运行脚本,该程序跟踪其标准日志并检查退出状态,如果退出状态不等于 0 ,则会输出一些错误。所以,当我在exitsystem之间的脚本中添加一些额外的行时,我可以看到我的C ++程序打印出来的错误,但是如果没有这样的额外行,则C ++程序会告诉脚本成功退出,表示退出状态为 0

1 个答案:

答案 0 :(得分:0)

你实际上没有证明这个问题,所以我不得不猜测如何演示它,然后失败了。

$ perl -e'
   sub interrupt {
      $SIG{"__DIE__"} = "";
      my $signal = shift;
      print STDERR "...\n";
      system("echo ...");
      exit 4;
   }
   $SIG{INT} = \&interrupt;
   <>;
'
^C...
...

$ echo $?
4

(使用4因为它比1更有特色。)

“甚至不叫”,你甚至是什么意思?你似乎表明程序确实因中断而退出,这意味着它被调用了。