supervisor是一个Python开发的通用的进程管理程序,可以管理和监控Linux上面的进程,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启,但它不能管理原本就是daemon的进程。

supervisor的安装和管理都非常方便

1. 安装

yum install supervisor

或者PIP安装

pip install supervisor

2. 生成配置文件
安装好以后,需要生成一份配置文件

echo_supervisord_conf > /etc/supervisord.conf

3. 为每个进程单独配置
你可以直接在/etc/supervisord.conf 里编写对任务控制的配置,更加合理的方法是在一个专门的文件夹中针对每一个进程进行配置,创建一个存储配置的目录

mkdir /etc/supervisord.d/
为每个程序编写一个配置文件,使得他们相互隔离,现在需要对/etc/supervisord.conf 进行修改以完成这个配置, 找到[include], 修改配置

[include] 注意这里include也要解开
files = /etc/supervisord.d/*.ini

4. 一份配置示例
在/etc/supervisord.d/目录下新增一个ini文件

[program:project_name]
directory = 工作目录
command = 脚本的启动命令
autostart = true
autorestart = true
startretries = 999999 #不断自重启
user = loanward
stdout_logfile = /data/log/pro_stdout.log

project_name 必须是唯一的,否则将会出现错乱
directory 填写你启动脚本时的工作目录,如果你使用脚本的绝对目录,那么directory可以不设置
command是执行脚本的命令,不需要使用nohup让其变为后代进程,supervisor会自动将其变为后台进程
autostart 配置为True, supervisor 启动时,任务跟随启动
autorestart 配置为True, 进程不存在时会自动重启, 默认重启3次,想修改重启次数,可以配置startretries, 设置最多重启的次数
user 设置启动任务时所用的用户,supervisor 有必要使用root账号启动,这样才有权限配置其他启动账号
stdout_logfile 配置输出日志

5. 启动supervisor

supervisord -c /etc/supervisord.conf

6、注意 长期运行后发现 配置文件都是临时路径 会被系统删除运行不稳定 出现 unix:///tmp/supervisor.sock no such file 报错
原因是 supervisor 默认配置会把 socket 文件和 pid 守护进程生成在/tmp/目录下,/tmp/目录是缓存目录,Linux 会根据不同情况自动删除其下面的文件。
原因找到了,就好办了,将 supervisor 配置文件里的相应地方改掉就好了。

vi /etc/supervisord.conf
[unix_http_server]
;file=/tmp/supervisor.sock   ; (the path to the socket file)
file=/var/run/supervisor.sock   ; 修改为 /var/run 目录,避免被系统删除

[supervisord]
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile=/var/log/supervisor/supervisord.log ; 修改为 /var/log 目录,避免被系统删除
pidfile=/var/run/supervisord.pid ; 修改为 /var/run 目录,避免被系统删除
...

[supervisorctl]
; 必须和'unix_http_server'里面的设定匹配
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=unix:///var/run/supervisor.sock ; 修改为 /var/run 目录,避免被系统删除

修改完成后创建/var/log/supervisor目录后,杀死当前进行 再进行<5>步骤重启

7. 使用supervisorctl 进行管理
supervisorctl 是 supervisord 的一个命令行客户端工具,使用supervisorctl可以遍历的对进程进行管理,支持的命令如下

supervisorctl status                         # 查看进程状态
supervisorctl stop project_name              # 终止某个进程
supervisorctl start project_name             # 启动某个进程
supervisorctl restart project_name           # 重启某个进程
supervisorctl reread                         # 更新配置,根据最新的配置启动程序,会启动已经运行的程序
supervisorctl update                         # 更新配置,重启配置有变化的进程,不会重启那些配置没有变化

这是我的一个示例我用一个ini文件启动该程序所需的全部指令 更方便于管理

[program:sjprice]
directory = /home/main/
command = python3 price.py
autostart = true
autorestart = true
startretries = 999999
user = root
stdout_logfile = /home/logs/price.log

[program:2]
...

相关链接
https://zhuanlan.zhihu.com/p/264111843
https://www.jianshu.com/p/0b9054b33db3
https://ld246.com/article/1546398597198