题 Ubuntu,新贵,并创建一个监控pid


下面是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"

34
2018-04-02 06:54


起源


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


答案:


如果您的计算机上有start-stop-daemon,我强烈建议您使用它来启动您的进程。 start-stop-daemon将处理以非特权用户身份启动进程而无需从sudo或su转发(在新贵食谱中推荐)它还内置了对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

68
2018-05-10 18:21



我错过了什么,或者是 start-stop-daemon 版本从未正常工作? Upstart不会跟踪PID start-stop-daemon 并假设工作已经终止 start-stop-daemon 回?这是我在测试中看到的行为,据我所知,它是设计的。 - cqcallaw
start-stop-daemon就像upstart和start-stop-daemon的--exec参数中指定的进程之间的透明中间人。所有的upstart命令和PID监视都应该像在--exec中直接附加到进程一样。您能提供一些关于似乎产生不同结果的测试类型的更多信息吗? - Egg
你还要向pid文件中输入$ USER吗? - José F. Romaniello
@CambridgeMike根据新贵的食谱(在我的回复中链接),setuid和setgid节只能在新手1.4+中使用。他们也对setuid说:“请注意,所有进程(预启动,停止后等)都将按用户指定的方式运行。”而s-s-d只能将你的upstart脚本中的一个进程作为非特权用户运行(边缘情况我想,但也许有人可能需要这个)。 setuid和s-s-d都解决了sudo或su的分叉问题,但最重要的是对于OP的问题,s-s-d还提供了PID管理。 - Egg
有趣的是,为什么新贵的作者建议不要混合使用start-stop-daemon和upstart? bugs.launchpad.net/ubuntu/+source/upstart/+bug/485721 - Kasisnu


Egg的第一个启动 - 停止 - 守护进程的例子是要走的路。

如果你选择第二,我会建议$$来获得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

21
2018-03-16 21:55



这是解决我的logstash问题的唯一解决方案。另请注意,该脚本最初失败,因为setuid需要sudo apt-get install super。必须是捆绑的upstart脚本中的apt依赖性。 - darKoram