我有一个用于设置远程主机的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 ,则会输出一些错误。所以,当我在exit
和system
之间的脚本中添加一些额外的行时,我可以看到我的C ++程序打印出来的错误,但是如果没有这样的额外行,则C ++程序会告诉脚本成功退出,表示退出状态为 0 。
答案 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更有特色。)
“甚至不叫”,你甚至是什么意思?你似乎表明程序确实因中断而退出,这意味着它被调用了。