软硬件环境

  • ubuntu 18.04 64bit
  • anaconda with python 3.6
  • supervisor 3.3.4

supervisor简介

supervisor是一个用python语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制。

安装supervisor

当前版本的supervisor暂不支持python3,因此呢不能直接用pip3 install supervisor来安装了,可喜的是基于python2supervisor同样可以管理使用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个系统命令supervisorctlsupervisordecho_supervisord_conf

  1. supervisord,运行supervisor时会启动一个进程supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启
  2. supervisorctl,是命令行管理工具,可以用来执行startstoprestart等命令,来对这些子进程进行管理, 如

    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 | 根据最新的配置,重启配置更改过的进程,未更新的进程不受影响 |

  3. echo_supervisord_conf用来生成默认的配置文件(默认配置文件,内容非常齐全且都有注释,适合用时查阅),用法是这样的

    echo_supervisord_conf > test.conf
    

supervisor的使用

这里以一个带参数的命令行工具为例,首先创建一个配置文件/etc/supervisor/conf.d/far.confconf.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

如果在配置的过程出现错误,在系统进程表中没有自己预期要运行的进程,那就需要自己去找原因了。一般的解决思路有

  1. 通过在命令行中运行来检查进程本身是否可以正常运行?
  2. 查看supervisor日志文件,如/var/log/supervisor/supervisord.log
  3. 通过supervisorctl工具调试
  4. 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

web_supervisor

参考资料



Comments

comments powered by Disqus