supervisor 简单使用流程
supervisor是什么?
Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。
supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
本文只记录简单的使用流程,不做深入探讨。
使用环境:centos7,python3.11.1
一、supervisor安装
这里只记录两种方法,本次使用第一种方法安装。
1、使用pip安装
pip3 install supervisor
2、使用yum安装,会生成默认配置/etc/supervisord.conf和目录 /etc/supervisord.d
yum install supervisor
二、配置文件
配置可以分成两类:supervisord.conf主进程配置和子进程配置。
1、生成主进程配置文件
/etc/supervisord.conf
为主进程配置文件。
echo_supervisord_conf > /etc/supervisord.conf
也可以自定义主进程配置文件位置:
echo_supervisord_conf > /usr/local/supervisord.conf
某些系统会定期删除/tmp中的文件。
所以在必要时修改主进程配置文件:
23行:[unix_http_server]配置区:
file=/tmp/supervisor.sock
修改为file=/var/run/supervisor.sock
。
49行:[supervisord]配置区:
pidfile=/tmp/supervisord.pid
修改为pidfile=/var/run/supervisord.pid
。
75行:[supervisorctl]配置区:
serverurl=unix:///tmp/supervisor.sock
修改为serverurl=unix:///var/run/supervisor.sock
。
2、web管理:
39行:修改主进程配置文件[inet_http_server]
配置区,取消注释,设置ip、端口、帐号和密码。
[inet_http_server] ; inet (TCP) server disabled by default
port=1.1.1.1:9001 ; ip_address:port specifier, *:port for all iface
username=admin ; default is no username (open server)
password=admin888 ; default is no password (open server)
如果不需要web管理功能,这一步可忽略。
3、设置子进程配置文件位置
在主进程配置文件supervisord.conf的最后一行后面添加:
[include]
files = /etc/supervisord.conf.d/*.ini
创建子进程配置文件所在目录:
mkdir -p /etc/supervisord.conf.d
地址支持通配符,上述意思是子进程配置文件位于/etc/supervisord.conf.d/目录里,是以ini结尾的文件。
三、启动supervisor
使用supervisor进程管理命令之前先启动supervisord,否则程序报错。
1、 启动supervisor,注意-c
后面的是第二步里生成的主进程配置文件。
supervisord -c /etc/supervisord.conf
附:如果提示Unlinking stale socket /var/run/supervisor.sock
那么执行:
unlink /var/run/supervisor.sock
2、添加应用
在/etc/supervisord.conf.d/里创建一个ini文件,比如test.ini,添加以下内容,具体内容以自己的项目为准。
;项目名
[program:test]
;脚本目录
directory=
;启动命令
command=
;停止进程的命令 默认 quit
;stopsignal=KILL
;supervisor启动的时候是否随着同时启动,默认True
autostart=true
;进程守护,默认unexpected
autorestart=true
;这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs=3
;日志
stdout_logfile=/var/log/supervisor/test.log
;错误日志:把stderr重定向到stdout,默认 false
redirect_stderr=true
;stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes=2MB
;stdout日志文件备份数
stdout_logfile_backups=5
;启动用户
user=root
;优先级,默认999
priority=999
;进程数量,默认1
numprocs=1
这里要注意日志的路径,如果路径不存在,会启用失败,比如路径为/var/log/supervisor,当supervisor不存在时,此脚本无法运行。如果这样设置了,要注意手动创建目录。
mkdir -p /var/log/supervisor
3、 添加子进程配置后,执行此命令启动子进程
supervisorctl update
所有supervisorctl命令:
# 查看所有进程的状态
supervisorctl status
# 停止某进程
supervisorctl stop [process_name]
# 启动某进程
supervisorctl start [process_name]
# 重启某进程
supervisorctl restart [process_name]
# 重新载入配置文件,新服务会被添加,不会重启现有运行服务
supervisorctl update
# 重新启动配置中的所有程序
supervisorctl reload
# 关闭supervisord
supervisorctl shutdown
# 清空进程日志
supervisorctl clear [process_name]
# 表示启动,关闭,重启所有进程
supervisorctl (start|stop|restart) all
# 进入到交互模式下,使用help查看所有命令
supervisorctl
其他:
1、查看supervisord进程:
ps -ef|grep supervisord
2、如果启动失败可以尝试:
# 查看supervisord进程
ps -ef|grep supervisord
# 输出:root 18528 1 0 03:44 ... supervisord -c /etc/supervisord.conf
# 结束supervisord进程
kill -9 18528
然后重新启动。
3、容易疑惑名词:
supervisor:要安装的软件的名称。
supervisord:装好supervisor软件后,supervisord用于启动supervisor服务。
supervisorctl:用于管理supervisor配置文件中program。
4、centos设置supervisord开机自启:
centos7 添加systemctl服务:https://github.com/Supervisor/initscripts
4.1 which supervisord命令和which supervisorctl命令查看supervisord与supervisorctl可执行文件路劲:
supervisord:/usr/local/python3.11.1/bin/supervisord
supervisorctl:/usr/local/python3.11.1/bin/supervisorctl
4.2 在/usr/lib/systemd/system/
目录创建supervisord.service
文件:
vim /usr/lib/systemd/system/supervisord.service
内容为:
#supervisord.service
[Unit]
Description=Supervisor daemon
[Service]
Type=forking
ExecStart=/usr/local/python3.11.1/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/local/python3.11.1/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/local/python3.11.1/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
然后才能运行下方命令:
4.3 将supervisor加入开机启动项
systemctl enable supervisord
验证是否开机自启动:
systemctl is-enabled supervisord
4.4 设置开机自启后,子配置文件里的启动命令必须要是完整路径
比如:
/usr/local/python3.11.1/bin/python3 test.py
网上看到说supervisor用的环境变量是基于supervisor.conf里设置的环境变量。
官方文档:http://supervisord.org/subprocess.html#subprocess-environment
所以如果不想用绝对路径的话,就需要在自配置文件里设置环境变量的值。
60行:在/etc/supervisord.conf (具体配置文件路径根据自己的来),[supervisord]配置区设置环境变量:
# 第60行,取消注释,然后修改环境变量,多个环境变量以“,”隔开
environment=KEY="value"
# 例子:
environment=PATH="/usr/local/python3.11.1/bin"
也可以在子配置文件里直接添加环境变量。
supervisor 环境变量设置:https://foofish.net/supervisor-envrionment.html
4.5 其他命令:
查看服务状态:
systemctl status supervisord
启动服务:
systemctl start supervisord
停用开机自启
systemctl disable supervisord
B站视频详解教程:https://www.bilibili.com/video/BV1r8411b75o?p=1
supervisor官方文档:http://www.supervisord.org/
supervisor 使用教程:https://www.cnblogs.com/loveCrane/p/15954893.html
supervisor 使用教程:https://blog.csdn.net/afterlife_union/article/details/125617381
5、定时重启:
很多时候,由于某些原因导致任务卡住,所以最好每天固定时间重启一下任务。
编辑定时任务:
crontab -e
添加定时任务,为每日凌晨3点重启;
0 3 * * * /usr/local/python3.11.1/bin/supervisorctl restart all > /dev/null 2&>1
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。