CentOS 中使用 Supervisor 守护进程服务自动重启

背景

小编最近写了一个简易的 go 后端服务,并部署到了 centos 服务器上,但是程序经常不明原因的挂掉,重启进程之后就能恢复。为了简单起见,我决定使用 supervisor 给 go 服务做进程守护,目标是让服务挂掉之后自动重启。

方案

  1. 安装 supervisor
sudo python -m pip install supervisor
  1. 新建配置文件

新建空白目录

cd /software
mkdir supervisor
cd supervisor

使用模板新建配置文件

echo_supervisord_conf > supervisord.conf

会在 /software/supervisor 目录下新建一个 supervisord.conf 模板文件

  1. 修改配置文件
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
  1. 新建日志文件
cd /software/go-ws
mkdir runtime
cd runtime
touch stderr.log
touch stdout.log
  1. 启动 supervisor

supervisord.conf文件所在目录,使用配置文件启动

cd /software/supervisor
supervisord -c supervisord.conf
  1. 查看进程状态
supervisorctl status

注意事项

  1. 注意supervisord.conf的 user 配置
# 以哪个用户来运行该进程
# user=root

此处,如果是非 root 用户登陆的 ssh,要把 user=root 注释掉,否则可能启动不了,查看日志文件会出现

supervisor: couldn't setuid to 0: Can't drop privilege as nonroot user
  1. supervisordsupervisorctl都需要执行命令时指定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 来做进程守护的一点经验。教程比较初级,欢迎一同学习交流。

参考

评论