调试在启动时终止的perl守护进程

时间:2013-01-22 00:05:53

标签: perl debugging nagios

我已经在我们的nagios框中设置并配置了Nagios remote external command daemon,但我发现它一旦启动它似乎终止没有任何错误。

服务器是ubuntu 12.10并且从tar文件安装了nrecd作为一个简单的过程 - 创建一个config目录,在/etc/rc.local中添加一行,将bin文件复制到/ usr / bin并执行配置

当我运行sudo nrecd时,响应为Server nrecd started successfully. PID = 10698.,但如果我立即运行ps -A | grep 10698,我什么也看不见。同样,netstat -an显示没有在5665上收听服务。

在日志文件中,我看到的唯一条目是当我停止服务器时(即使那些是假设我sudo nrecd stop删除过时的pidfile时实际发生的所有错误)。

在/ usr / bin / nrecd中,我查看了打印“Server successfully started”行的代码,并在该地方添加了一些其他print

my $mypid = daemonize();
print "Server $basename started successfully. PID = $mypid.\n" if $mypid;
print "line 122";
create_pid_file( $mypid, $pidfile );
print "line 124";
change_privileges( $user, $group );
print "line 126";
lock_stdio();
print "line 128";
chmod( 0666, $logfile );
print "line 130";
logmsg( "Server $basename Started Successfully.\n" );

现在我明白了:

Server nrecd started successfully. PID = 10698.
line 122line 124line 126

这告诉我问题出在lock_stdio();子。这接近我被卡住的地方。我不是一个perl程序员,但即使对我来说,所有sub看起来都是标准 - 只需将IO重定向到/ dev / null。我尝试用perl -d运行它,但我最终做的就是逐行浏览文件并且没有学到任何新东西。

子本身是:

sub lock_stdio {
    open( STDIN,  '<', '/dev/null'  ) or croak "Can't read /dev/null: $!";
    open( STDOUT, '>>', '/dev/null' ) or croak "Can't write to /dev/null: $!";
    open( STDERR, '>>', '/dev/null' ) or croak "Can't write to /dev/null: $!";
    return();
};

在解决这个问题方面,有人可以提出任何建议吗?如果它确实是孤立的那3行子我觉得荒谬的不能找到问题(因为我说它看起来像我的股票标准)。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

抱歉不要将此作为评论,但我没有足够的代表。

您的lock_stdio子将所有输出发送到/dev/null,因此在您调用之后,您将看不到print语句的任何输出。如果你注释掉那个子,会有什么变化吗?

答案 1 :(得分:1)

问题不在lock_stdio子句中,这就是输出停止到初始stdout并开始转到/ dev / null的地方。

尝试打开其他文件:

open my $debugfile, '>>', 'somefilename' or die "couldn't open debug file: $!\n";

并将调试语句写入:

print $debugfile "line xxx\n";

您是否查看过任何错误消息的日志文件?