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
文章目录