【问题标题】:debugging a perl daemon that terminates on startup调试在启动时终止的 perl 守护程序
【发布时间】:2013-01-22 08:19:57
【问题描述】:

我已经在我们的 nagios 盒子上设置和配置了Nagios remote external command daemon,但我发现它一启动它似乎就终止了,没有任何错误。

服务器是 ubuntu 12.10 并且 nrecd 是从 tar 文件作为一个简单的过程安装的 - 创建一个配置目录,在 /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 中,我查看了打印“服务器成功启动”行的代码,并在该位置周围添加了一些其他 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 行子线隔离,我觉得无法找到问题是荒谬的(正如我所说,它对我来说看起来很标准)。任何帮助表示赞赏!

【问题讨论】:

  • 大量 derp - 刚刚意识到打印当然停在那里 - 标准输出已关闭

标签: perl debugging nagios


【解决方案1】:

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

尝试打开其他文件:

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

并将您的调试语句写入:

print $debugfile "line xxx\n";

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

【讨论】:

  • 当我第一次读到这篇文章时,我觉得有点刺耳“他甚至没有读过我的问题吗?天哪!”,但这让我思考为什么这些东西没有出现在之后有日志语句时的日志文件。我发现虽然我以 root 身份运行程序,但在启动时它本身对 nagios 用户来说是 suid,它无权访问日志文件。 chmod 0777ing 日志文件修复了它。非常尴尬的问题:$ 非常感谢你的脑洞
【解决方案2】:

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

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

【讨论】:

  • 是的,我注意到了同样的事情。注释掉子会带来一系列全新的错误,因为评论时间过长,但基本上权限被拒绝(即使使用 sudo 运行)
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2012-11-23
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多