【问题标题】:Ubuntu, upstart, and creating a pid for monitoringUbuntu,暴发户,并创建一个用于监控的pid
【发布时间】:2012-04-15 20:28:45
【问题描述】:

下面是一个redis的upstart脚本。如何创建 pid 以便使用 monit 进行监控?

#!upstart
description "Redis Server"

env USER=redis

start on startup
stop on shutdown

respawn

exec sudo -u $USER sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf 2>&1 >> /var/log/redis/redis.log"

【问题讨论】:

  • 既然已经指定了respawn,为什么还要使用monit?
  • @auny 除了 upstart/respawn 还使用 monit 的原因是 respawn 只知道进程是否处于活动状态,但不知道应用程序是否处于不良状态或不是。另一方面,Monit 可以以不同的方式与应用程序交互,例如点击 http 状态端点,以处理进程可能正在运行但应用程序处于错误或损坏状态的情况,这表明进程需要重新启动。
  • Redis 现在有自己的 pid 功能(redis.conf 中的 pidfile) -- download.redis.io/redis-stable/redis.conf

标签: ubuntu upstart


【解决方案1】:

如果您的机器上可以使用 start-stop-daemon,我强烈建议您使用它来启动您的进程。 start-stop-daemon 将处理以非特权用户身份启动进程,而无需从 sudo 或 su (recommended in the upstart cookbook) 分叉,并且它还内置了对 pid 文件管理的支持。例如:

/etc/init/app_name.conf

#!upstart
description "Redis Server"

env USER=redis

start on startup
stop on shutdown

respawn

exec start-stop-daemon --start --make-pidfile --pidfile /var/run/app_name.pid --chuid $USER --exec /usr/local/bin/redis-server /etc/redis/redis.conf >> /var/log/redis/redis.log 2>&1

您也可以手动管理 pid 文件,方法是使用 post-start script 节创建它并使用 post-stop script 节删除它。例如:

/etc/init/app_name.conf

#!upstart
description "Redis Server"

env USER=redis

start on startup
stop on shutdown

respawn

exec sudo -u $USER sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf 2>&1 >> /var/log/redis/redis.log"

post-start script
    PID=`status app_name | egrep -oi '([0-9]+)$' | head -n1`
    echo $PID > /var/run/app_name.pid
end script

post-stop script
    rm -f /var/run/app_name.pid
end script

【讨论】:

  • 是我遗漏了什么,还是start-stop-daemon 版本永远无法正常工作? Upstart 不会跟踪start-stop-daemon 的PID 并假设在start-stop-daemon 返回时工作已经终止吗?这是我在测试中看到的行为,据我所知,这是设计使然。
  • start-stop-daemon 就像一个透明的中间人,介于 upstart 和 start-stop-daemon 的 --exec 参数中指定的进程之间。您所有的新贵命令和 PID 监控都应该像它们直接附加到 --exec 中的进程一样。您能否提供更多关于似乎产生不同结果的测试类型的信息?
  • 您还必须将 $USER 写入 pid 文件吗?
  • @CambridgeMike 根据暴发户食谱(在我的回复中链接),setuid 和 setgid 节仅在暴发户 1.4+ 中可用。他们还对 setuid 说:“请注意,所有进程(启动前、停止后等)都将按照用户指定的方式运行。”而 s-s-d 只能针对新贵脚本中的单个进程以非特权用户身份运行(我认为是边缘情况,但也许有人可能需要这个)。 setuid 和 s-s-d 都解决了从 sudo 或 su 分叉的问题,但最重要的是对于 OP 的问题,s-s-d 还提供了 PID 管理。
  • 有趣的是,为什么upstart的作者建议不要混合start-stop-daemon和upstart? bugs.launchpad.net/ubuntu/+source/upstart/+bug/485721
【解决方案2】:

Egg 的第一个带有 start-stop-daemon 的例子是可行的。

如果你选择第二个,我会建议 $$ 来获取 PID。

#!upstart
description "Redis Server"

env USER=redis

start on startup
stop on shutdown

respawn

script
    echo $$ > /var/run/app_name.pid
    exec sudo -u $USER sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf 2>&1 >> /var/log/redis/redis.log"
end script

post-stop script
    rm -f /var/run/app_name.pid
end script

【讨论】:

  • 这是解决我的 logstash 问题的唯一解决方案。另请注意,脚本最初失败是因为 setuid 需要 sudo apt-get install super。在捆绑的 upstart 脚本中必须是一个容易损坏的依赖项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2014-10-02
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多