如何使用supervisor托管守护进程?

阅读本文大概需要 2 分钟。

supervisor 通常情况下只能托管前台进程,如果想托管守护进程(daemon)的话,需要包装一层shell来实现,否则会出现BACKOFF Exited too quickly错误,导致一直重启进程; 这里不讲如何托管前台进程,下面具体说下如何实现托管守护进程,核心原理就是加一层shell,代理supervisor stop信号

操作如下

增加 /etc/supervisord.d/test.conf

[program:test]
command=sh /home/webroot/test/supervisor-wrapper.sh
directory=/home/webroot/test
autostart=false
startsecs=3
autorestart=true
startretries=10

增加 /home/webroot/test/supervisor-wrapper.sh

#! /usr/bin/env bash
set -eu
# 进程id文件,进程启动时需要写入进程id到此文件
pidfile="/home/webroot/test/your-daemon.pid"
# 真正的进程启动程序
command=/home/webroot/test/your-daemon 
function kill_app(){
    kill $(cat $pidfile)
    exit 0 # 正常退出
}
# 代理 supervisor stop test
trap "kill_app" SIGINT SIGTERM
# Launch daemon
$command
sleep 2
# 持续判断进程是否存在
while [ -f $pidfile ] && kill -0 $(cat $pidfile) ; do
    sleep 0.5
done
# 进程不存在时异常退出,触发supervisor start test
exit 1000 

验证

supervisor 启动test后,supervisor status 不出现 BACKOFFExitedtoo quickly错误; 手动kill掉进程,supervisor能自动拉起进程,说明托管成功

总结

这种方法适合所有守护进程托管,不过类似nginx,php-fpm 默认都是以daemon防守启动,但本身支持前台方式启动,可以不用使用这种方式; 比如nginx 通过-g 参数控制前台启动: command=/home/nginx/sbin/nginx -g "daemon off;" -c /home/nginx/conf/nginx.conf 比如php 通过-F 参数控制前台启动:command=/home/php/sbin/php-fpm -c /home/php/etc/php.ini --fpm-config /home/php/etc/php-fpm.conf -F

码上行动

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值