我已经在我们的 nagios 机器上设置和配置了Nagios 远程外部命令守护程序,但我发现它一旦启动它似乎就终止而没有任何错误。
服务器是 ubuntu 12.10 并且 nrecd 是从 tar 文件作为一个简单的过程安装的 - 创建一个配置目录,在 /etc/rc.local 中添加一行,将 bin 文件复制到 /usr/bin 并进行配置。
当我运行时sudo nrecd
,响应是Server nrecd started successfully. PID = 10698.
,但是如果我立即运行,ps -A | grep 10698
我什么也看不到。同样,anetstat -an
显示没有服务在 5665 上侦听。
在日志文件中,我看到的唯一条目是当我停止服务器时(考虑到当我sudo nrecd stop
删除陈旧的 pidfile 时实际发生的所有事情,即使这些都是虚假的)。
在 /usr/bin/nrecd 中,我查看了打印“服务器成功启动”行的代码,并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 行子线隔离,我觉得无法找到问题很荒谬(正如我所说的那样,它对我来说看起来很标准)。任何帮助表示赞赏!