0

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

4

1 回答 1

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 更有特色。)

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

于 2013-03-15T07:33:57.067 回答