0

我已经在我们的 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 行子线隔离,我觉得无法找到问题很荒谬(正如我所说的那样,它对我来说看起来很标准)。任何帮助表示赞赏!

4

2 回答 2

1

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

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

于 2013-01-22T00:19:38.993 回答
1

问题不在于 lock_stdio 子,这只是您的输出停止进入初始标准输出并开始进入 /dev/null 的地方。

尝试打开一个不同的文件:

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

并将您的调试语句写入:

print $debugfile "line xxx\n";

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

于 2013-01-22T00:19:57.927 回答