【发布时间】: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,它会打印一些错误。所以,当我在我的脚本中在exit 和system 之间添加一些额外的行时,我可以看到我的 C++ 程序打印的错误,但是如果没有这样的额外行,C++ 程序会告诉脚本已成功退出,这意味着退出状态为 0。
【问题讨论】:
-
还有另一种可能。如果您在某处有一个 END{...} 块,它可能正在更改退出代码。你呢?
-
不,我没有这样的块。即使我有,如果最后两行之间还有一个额外的
print,也会被调用。 -
好的,这是我唯一能想到的退出代码更改的场合。您正在对未调用
exit做出一些假设。我认为更准确的症状应该描述为“返回码已更改”。我会怀疑你在调用者中检测返回码的方式。 -
添加了一些细节,但 IMO 没有意义。