die()在Perl脚本中不会退出的情况是什么?

7
我正在调试一个长时间运行的Perl脚本出现的奇怪问题。
问题是当使用die()时,脚本不像预期的那样退出。相反,脚本会一直挂起而没有返回结果。
我没有自己定义任何错误处理程序,因此我认为die()应该导致脚本立即终止。
以下是脚本和所使用模块的基本结构:
#!/usr/bin/perl

use strict;
use utf8;
use warnings;

use DBI; # with MySQL driver ("dbi:mysql:database=...")
use Geo::IP;
use POSIX;
use URI::Escape;

open(COMMAND, 'command_line |');
while (<COMMAND>) {
    #
    # .. stuff that can go wrong ..
    #
    die("I'm expecting the script to terminate here. It doesn't.") if ($gone_wrong);
}
close(COMMAND);

这种行为的解释是什么?使用的模块中是否有已知设置错误处理程序的模块可以解释脚本在die()上挂起的情况?

4
在您的 die() 调用之前添加一个调试行:warn "DIE = $SIG{__DIE__}",以查看此时是否存在 die 处理程序。 - Jonathan Hall
'command_line'程序是什么?你是在循环内部使用mysql DBI连接吗? - Corey Henderson
1
你是否看到了 die 消息?你的问题并没有表达得很清楚。如果没有,将 warn 添加在其前面可以显示你是否真正到达了 die。如果这显而易见,那么请原谅! - plusplus
核心:command_line程序是一个普通的Linux应用程序,它写入STDOUT。没有花哨的东西,也没有与Perl脚本进行交互的必要,除了通过管道写入的内容。mysql DBI连接在循环内部使用。 - knorv
你确定 $gone_wrong 条件已经满足了吗?就像其他人说的那样,在那里添加一个 warn/print 语句来查看。它们应该独立于任何 DIE 处理程序发生。 - mpeters
1个回答

4

嗯,即使出现die错误,END块和对象解构器仍然会被调用。如果其中一个挂起(或执行需要很长时间的操作),脚本将不会立即退出。但这应该发生在从die打印消息之后(除非标准错误被缓冲以便您无法立即看到消息)。

您提到了DBI,因此您可能有一个数据库句柄,其解构器正在被调用。(我不确定那是否是问题所在。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接