原文出处: https://xugaoxiang.com/2019/12/04/supervisor/
软硬件环境
- ubuntu 18.04 64bit
- anaconda with python 3.6
- supervisor 3.3.4
supervisor简介
supervisor
是一个用python
语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor
监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制。
安装supervisor
当前版本的supervisor
暂不支持python3
,因此呢不能直接用pip3 install supervisor
来安装了,可喜的是基于python2
的supervisor
同样可以管理使用python3
编写的进程。
sudo apt-get install python-pip
sudo /usr/bin/pip install supervisor
如果是通过sudo apt-get install supervisor
来安装的话,同样也是不支持python3
的,可以通过locate supervisord
来验证下
xugaoxiang@ubuntu:~/Work/gogs/blog$ locate supervisord
/usr/local/bin/echo_supervisord_conf
/usr/local/bin/supervisord
/usr/local/lib/python2.7/dist-packages/supervisor/supervisord.py
/usr/local/lib/python2.7/dist-packages/supervisor/supervisord.pyc
/usr/local/lib/python2.7/dist-packages/supervisor/tests/test_supervisord.py
/usr/local/lib/python2.7/dist-packages/supervisor/tests/test_supervisord.pyc
github
上的supervisor
代码仓库已经支持了python3
,可以直接clone
下来,通过sudo python3 setup.py install
进行安装。
supervisor相关的几个命令
安装完毕,会生成3个系统命令supervisorctl
、supervisord
和echo_supervisord_conf
-
supervisord
,运行supervisor
时会启动一个进程supervisord
,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启 -
supervisorctl
,是命令行管理工具,可以用来执行start
、stop
、restart
等命令,来对这些子进程进行管理, 如sudo supervisorctl start far
其中far是进程的名称, 详细的命令及说明见下面的这张表
命令 说明 supervisorctl start program_name 启动某个进程 supervisorctl stop program_name 停止某个进程 supervisorctl restart program_name 重启某个进程 supervisorctl status program_name 查看某个进程的状态 supervisorctl stop all 停止全部进程 supervisorctl reload 载入最新的配置文件,重启所有进程 supervisorctl update 根据最新的配置,重启配置更改过的进程,未更新的进程不受影响 -
echo_supervisord_conf
用来生成默认的配置文件(默认配置文件,内容非常齐全且都有注释,适合用时查阅),用法是这样的echo_supervisord_conf > test.conf
supervisor的使用
这里以一个带参数的命令行工具为例,首先创建一个配置文件/etc/supervisor/conf.d/far.conf
,conf.d
目录下的所有进程配置文件都会通过/etc/supervisor/supervisord.conf
被包含进来,为方便管理,我们都是将一个进程的管理写成一个配置文件,彼此一一对应。输入如下内容
xugaoxiang@ubuntu:/etc/supervisor/conf.d# cat far.conf
[program:far]
command=FacialAttendanceRecord --config /home/xugaoxiang/www/config/sys.json --model /home/xugaoxiang/www/model/longjing.clf --dataset /home/xugaoxiang/www/storage --webport 8888 --threshold 0.38
directory=/home/xugaoxiang/www
autostart=true
autorestart=true
user=root
redirect_stderr=true
接下来启动服务
sudo /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
这时候终端就会输出
2018-12-04 14:29:44,916 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. If you intend to run as root, you can set user=root in the config file to avoid this message.
2018-12-04 14:29:44,916 INFO Included extra file "/etc/supervisor/conf.d/far.conf" during parsing
2018-12-04 14:29:44,926 INFO RPC interface 'supervisor' initialized
2018-12-04 14:29:44,926 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2018-12-04 14:29:44,926 INFO supervisord started with pid 32363
2018-12-04 14:29:45,931 INFO spawned: 'far' with pid 32366
2018-12-04 14:29:46,933 INFO success: far entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
还可以通过supervisorctl status
来查看进程的状态
xugaoxiang@ubuntu:~/www$ sudo supervisorctl status far
far RUNNING pid 32366, uptime 0:01:11
如果在配置的过程出现错误,在系统进程表中没有自己预期要运行的进程,那就需要自己去找原因了。一般的解决思路有
- 通过在命令行中运行来检查进程本身是否可以正常运行?
- 查看
supervisor
日志文件,如/var/log/supervisor/supervisord.log
- 通过
supervisorctl
工具调试 ubuntu
系统中注意权限问题
supervisor的web化
有些童鞋生来讨厌命令行(那还学什么linux
?),庆幸的是supervisor
提供了基于web
的控制,管理员可以通过在页面上点点按钮即可完成对进程的启动、重启等操作,甚是方便。
首先需要编辑/etc/supervisor/supervisor.conf
, 添加语句
[inet_http_server]
port=127.0.0.1:9001
;username=xugaoxiang
;password=xugaoxiang
然后重启服务
sudo /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
打开浏览器,输入地址127.0.0.1:9001
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yj5N1buB-1576036327588)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/linux/supervisor_01.png)]