【问题标题】:Why exit is not always called in perl?为什么在 perl 中并不总是调用 exit?
【发布时间】:2013-03-03 20:12:32
【问题描述】:

我有一个用于设置远程主机的 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

【问题讨论】:

  • 还有另一种可能。如果您在某处有一个 END{...} 块,它可能正在更改退出代码。你呢?
  • 不,我没有这样的块。即使我有,如果最后两行之间还有一个额外的print,也会被调用。
  • 好的,这是我唯一能想到的退出代码更改的场合。您正在对未调用 exit 做出一些假设。我认为更准确的症状应该描述为“返回码已更改”。我会怀疑你在调用者中检测返回码的方式。
  • 添加了一些细节,但 IMO 没有意义。

标签: perl exit


【解决方案1】:

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

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

$ echo $?
4

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

“未调用”是什么意思?您似乎表明程序确实由于中断而退出,这意味着它被调用了。

【讨论】:

  • 对不起,我没有得到你的答案。我从我的 C++ 程序运行脚本,该程序跟踪其标准日志并检查退出状态,如果退出状态!= 0,它会打印一些错误。因此,当我在脚本中在 exitsystem 之间添加一些额外的行时,我可以看到我的 C++ 程序打印的错误,但是如果没有这样的额外行,C++ 程序会告诉脚本已成功退出,这意味着 exit_status == 0
  • 我要求演示您的问题。目前,我们所拥有的只是在未指定的情况下无法验证的 Perl 错误声明。
  • 如果你写了评论而不是答案会更好,因为如果有人看到一个已经回答的问题,他/她很可能不会打开它来给出另一个答案:)
  • 我会,但我发布的内容不适合评论并且无法阅读。
  • 但这不仅仅是一条评论。答案在于找出问题的问题所在,因此发布问题错误是唯一可能的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2019-11-13
  • 1970-01-01
  • 2018-06-17
相关资源
最近更新 更多