我已经在我们的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行子我觉得荒谬的不能找到问题(因为我说它看起来像我的股票标准)。任何帮助表示赞赏!
答案 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";
您是否查看过任何错误消息的日志文件?