Puppet初始化脚本没有创建pid文件?

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

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/

我知道启动后手动将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/

请在回复中包含您正在使用的操作系统的名称/版本/发行版。还要发布运行“which daemon”的输出。问题可能出在daemon命令上,但我很难找到相同的文档/错误列表。 - Rob Kielty
在基于Red Hat的系统中,daemon是一个在/etc/rc.d/init.d/functions脚本中定义的“标准”函数。我更新了我的问题。 - quanta
fpaste.org的链接坏掉了... :( - eikonomega
2个回答

2
控制程序(在这种情况下是puppetmasterd)负责创建pidfile,而不是daemon()函数;daemon()依赖此操作。
请确认puppetmasterd创建其pidfile的位置(例如/var/run/puppet.pid/var/lib/puppet/run/master.pid等)。要查找,请检查puppetmasterd的内容(如果是脚本),或者杀死puppetmasterd然后运行strace -f puppetmasterd 2>&1 | grep '\.pid'
相应地修改/etc/init.d/puppetmasterpidfile的值。

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 labs documentation以了解有关此选项的更多信息。
    • 需要注意的是,如果$PUPPETMASTER正在使自己成为守护进程,则传递给daemon()--pidfile参数将不起作用。

祝你编程愉快!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接