我正在使用长时间运行的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()
上的脚本?
答案 0 :(得分:4)
好吧,在END
之后仍然会调用die
块和对象析构函数。如果其中一个挂起(或做了需要很长时间的事情),脚本将不会立即退出。但是在<{1}}打印消息之后会发生(除非STDERR被缓冲,因此您不会立即看到消息)。
你提到DBI,所以你可能有一个数据库句柄,它的析构函数被调用。 (不过我不确定是不是问题。)