5
  • CentOS 5.4 版(最终版)
  • puppet-server-2.7.19-1.el5从 puppetlabs repo 安装。

puppetmaster已成功启动,但不会创建 pid 文件。[ FAILED ]这是停止时消息的原因:

/etc/init.d/puppetmaster stop
Stopping puppetmaster:                                     [FAILED]

初始化脚本: http: //fpaste.org/nsfI/

图书馆/etc/rc.d/init.d/functions: http: //fpaste.org/ox5Q/

这就是我在调试模式下运行时得到的结果:http: //fpaste.org/DkoS/

我知道echo启动后手动将pid指向文件的方式,但是为什么daemon函数--pidfile不起作用?

daemon $PUPPETMASTER $PUPPETMASTER_OPTS --masterport=${PUPPETMASTER_PORTS[$i]} --pidfile=/var/run/puppet/puppetmaster.${PUPPETMASTER_PORTS[$i]}.pid

当然,Puppet master 以puppet用户身份运行:

ps -ef | grep [p]uppet
puppet   23418     1  0 18:13 ?        00:00:00 /usr/bin/ruby /usr/sbin/puppetmasterd

/var/run/puppet/文件夹的所有者是puppet

# ls -ld /var/run/puppet/
drwxr-xr-x 2 puppet puppet 4096 Sep 17 18:46 /var/run/puppet/
4

2 回答 2

2

由受控程序(在这种情况下puppetmasterd)而不是daemon()函数来创建 pidfile;daemon()依赖于此。

确认创建它的 pidfile 的位置puppetmasterd(它可能是/var/run/puppet.pid,/var/lib/puppet/run/master.pid等)。要找出答案,请检查puppetmasterd(如果是脚本)的内容,或者 kill puppetmasterdthen strace -f puppetmasterd 2>&1 | grep '\.pid'

相应地修改pidfile您的值/etc/init.d/puppetmaster

于 2012-11-23T18:04:51.670 回答
0

所以,在我看来,这里可能有两种可能性:

  1. 如果您尝试使用 daemon 命令的 --pidfile 选项,我相信您有语法问题。

    • Red Hat 的 daemon 命令具有以下(无用)签名:Usage: daemon [+/-nicelevel] {program}. 不完全清楚的是,您在程序位置之后包含的任何内容都被视为传递给程序的选项,而不是传递给守护程序函数调用。
    • 因此,在您的情况下,您将--pidfile参数传递给$PUPPETMASTER自身,而不是daemon(). 您可以使用以下方法解决此问题:daemon --pidfile=/var/run/puppet/puppetmaster.${PUPPETMASTER_PORTS[$i]}.pid $PUPPETMASTER $PUPPETMASTER_OPTS --masterport=${PUPPETMASTER_PORTS[$i]}
  2. 这里的第二个选项是$PUPPETMASTER(或者更确切地说,它背后的程序)可能会自己守护进程,如果是这样,可能会负责创建自己的 .pid 文件。流程管理工具Circus就是以这种方式工作的。它可能是配置文件中的一个选项或由$PUPPETMASTER.

    • 我不是 Puppet 用户,因此无法在此处为您提供具体信息。但我会查看Puppet 实验室文档以了解有关此选项的更多信息。
    • 重要的是要注意,如果 $PUPPETMASTER 自己在守护进程,那么--pidfile传递给的参数daemon()将无效。

好狩猎!

于 2014-01-08T01:30:04.310 回答