CentOS 中使用 Supervisor 守护进程服务自动重启
背景
小编最近写了一个简易的 go 后端服务,并部署到了 centos 服务器上,但是程序经常不明原因的挂掉,重启进程之后就能恢复。为了简单起见,我决定使用 supervisor 给 go 服务做进程守护,目标是让服务挂掉之后自动重启。
方案
- 安装 supervisor
sudo python -m pip install supervisor
- 新建配置文件
新建空白目录
cd /software
mkdir supervisor
cd supervisor
使用模板新建配置文件
echo_supervisord_conf > supervisord.conf
会在 /software/supervisor
目录下新建一个 supervisord.conf
模板文件
- 修改配置文件
vim supervisord.conf
在文件最后粘贴以下配置
[program:main]
# 设置命令在指定的目录内执行
directory=/software/go-ws
# 这里为您要管理的项目的启动命令
command=/software/go-ws/main
# 以哪个用户来运行该进程
# user=root
# supervisor 启动时自动该应用
autostart=true
# 进程退出后自动重启进程
autorestart=true
# 进程持续运行多久才认为是启动成功
startsecs=1
# 重试次数
startretries=5
# stderr 日志输出位置
stderr_logfile=/software/go-ws/runtime/stderr.log
# stdout 日志输出位置
stdout_logfile=/software/go-ws/runtime/stdout.log
- 新建日志文件
cd /software/go-ws
mkdir runtime
cd runtime
touch stderr.log
touch stdout.log
- 启动 supervisor
到supervisord.conf
文件所在目录,使用配置文件启动
cd /software/supervisor
supervisord -c supervisord.conf
- 查看进程状态
supervisorctl status
注意事项
- 注意
supervisord.conf
的 user 配置
# 以哪个用户来运行该进程
# user=root
此处,如果是非 root 用户登陆的 ssh,要把 user=root
注释掉,否则可能启动不了,查看日志文件会出现
supervisor: couldn't setuid to 0: Can't drop privilege as nonroot user
supervisord
和supervisorctl
都需要执行命令时指定supervisord.conf
文件
你可以进入 supervisor 配置所在目录再执行
cd /software/supervisor
supervisorctl -c supervisord.conf status
或者通过全局路径直接指定
supervisorctl -c /software/supervisor/supervisord.conf status
不指定路径运行命令的话,可能会提示错误
error: <class 'xmlrpclib.ProtocolError'>, <ProtocolError for 127.0.0.1/RPC2: 404 Not Found>: file: /usr/lib/python2.7/site-packages/supervisor/xmlrpc.py line: 545
常用命令
supervisorctl status ---- 查看supervisor管理进程的状态;
supervisorctl stop main ---- 用来关闭某个进程,programname指上例中的flasky;
supervisorctl start main ---- 用来启动某个进程;
supervisorctl restart main ---- 用来重启某个进程;
supervisorctl stop all ---- 关闭所有的进程;
supervisorctl reload ---- 停止所有进程,载入最新的配置文件,并根据最新的配置启动、管理进程;
supervisorctl update ---- 根据最新的配置文件,启动新配置的进程或重启配置有变化的进程,没有改动过的进程不会受到影响;
supervisorctl shutdown ---- 关闭supervisor服务。
总结
以上就是小编在部署 go 服务到 centos 上后,设置 supervisor 来做进程守护的一点经验。教程比较初级,欢迎一同学习交流。
评论