Puppet init脚本不会创建pid文件?

时间:2012-10-07 11:28:47

标签: bash puppet init.d sysv

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

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

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

init脚本: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/

2 个答案:

答案 0 :(得分:2)

创建pid文件取决于受控程序(在本例中为puppetmasterd),而不是daemon()函数; daemon()依赖于此。

确认 puppetmasterd创建其pid文件的位置(可能是/var/run/puppet.pid/var/lib/puppet/run/master.pid等。)要查找,请检查{{1}的内容(如果是脚本),或者杀死puppetmasterd然后puppetmasterd

相应地修改strace -f puppetmasterd 2>&1 | grep '\.pid'pidfile的值。

答案 1 :(得分:0)

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

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

    • Red Hat的守护进程命令具有以下(无用的)签名: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 labs documentation以了解有关此选项的更多信息。
    • 重要的是要注意$ PUPPETMASTER是否正在守护自身,然后传递给--pidfile的{​​{1}}参数将无效。
  3. 好狩猎!