如何使用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

码上行动

如何使用supervisor托管守护进程?_第1张图片

你可能感兴趣的:(如何使用supervisor托管守护进程?)