前言
平时开发调试中使用conda环境,项目比较多环境多,而且命令繁杂,每一次启动项目都可能会因为忘记启动方式而频繁报错。现在可以通过supervisor来管理,只需要配置几个文件,就可以轻松通过简单一致的命令启动工程,并且保持在后台运行,如果程序异常中断,还可以自动重启。
安装
apt install supervisor
生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
在配置文件里修改配置内容,一般在配置文件的最后面
[include] files = /etc/supervisord.d/*.conf
为每个工程配置conf
/etc/supervisord.d是一个所有进程配置的父文件夹,比如有project1,project2,project3,那么/etc/supervisord.d文件夹中就会有project1.conf,project2.conf,project3.conf
创建配置文件夹
mkdir /etc/supervisord.d/
配置相关信息
vim /etc/supervisord.d/project1.conf
示例配置内容
[supervisord]
strip_ansi = true
[program:project]
directory = /data/ai_lab/msf/ComfyUI
command = /home/username/miniconda3/envs/project_env/bin/python main.py --listen
autostart = true
autorestart = true
user = root
stdout_logfile = /data/project.log
-
project_name 必须是唯一的,否则将会出现错乱
-
directory 填写你启动脚本时的工作目录,如果你使用脚本的绝对目录,那么directory可以不设置
-
command是执行脚本的命令,不需要使用nohup让其变为后代进程,supervisor会自动将其变为后台进程,command最好是虚拟环境bin目录下的python解释器的绝对路径,否则可能会找错解释器路径,导致程序报错。
-
autostart 配置为True, supervisor 启动时,任务跟随启动
-
autorestart 配置为True, 进程不存在时会自动重启, 默认重启3次,想修改重启次数,可以配置startretries, 设置最多重启的次数
-
user 设置启动任务时所用的用户,supervisor 有必要使用root账号启动,这样才有权限配置其他启动账号
-
stdout_logfile 配置输出日志,可以将所有进程日志存放在一个好找的文件夹,或者都存放到每一个工程的目录下,但为了方便找,一般统一放在一个目录里。
启动supervisor
supervisord -c /etc/supervisord.conf
设置supervisor开机自启动
sudo systemctl enable supervisor
判断supervisor是否开机自启动
sudo systemctl is-enabled supervisor
supervisorctl管理进程
supervisorctl 是 supervisord 的一个命令行客户端工具,使用supervisorctl可以遍历的对进程进行管理,支持的命令如下
project是示例配置内容中[program:project]的project
supervisorctl status #查看进程状态
supervisorctl stop project #终止某个进程
supervisorctl start project #启动某个进程
supervisorctl restart project #重启某个进程
supervisorctl reread #更新配置,根据最新的配置启动程序,会启动已经运行的程序
supervisorctl update #更新配置,重启配置有变化的进程,不会重启那些配置没有变化
参考链接:
https://zhuanlan.zhihu.com/p/264111843
https://github.com/Supervisor/supervisor/issues/85
http://supervisord.org/configuration.html#supervisord-section-values
https://blog.csdn.net/codeswarrior/article/details/107511960