Supervisor是python2写就的一款强大的运维工具,众所周知,
目前Supervisor还不支持python3,那么怎么利用Supervisor监控python3程序呢?本文主要讲述Supervisor在
Ubuntu下的安装部署以及上述问题的解决。
安装及设置
可通过pip安装,如果你已经是python3的pip,会安装失败,那么可以用sudo apt-get install supervisor
来安装,默认由Ubuntu自带的 /usr/bin/python2.7
驱动。
运行echo_supervisord_conf > /etc/supervisor/supervisord.conf
来产生设置,未避免产生非root用户的权限错误,将/etc/supervisor/supervisord.conf
内[unix_http_server]
这项改为(;
即是注释):
1 | [unix_http_server] |
再将末尾的[include]
部分改为:
1 | [include] |
这样方便为每个app单独设置conf文件而不必全部写在全局设置里面。
在启动supervisorctl
须先启动supervisord
,否则会出现error: <class 'socket.error'>, [Errno 99] Cannot assign requested address: file: /usr/lib/python2.7/socket.py line: 575
错误:
1 | sudo supervisord -c /etc/supervisor/supervisord.conf |
在/etc/supervisor/conf.d/
里新建app.conf
文件,
1 | [program:app] |
再介绍两个有用的配置项stopasgroup
和killasgroup
,如果我们用Flask等Rest服务,通常其会开启几个进程,那么如果stopasgroup
不启用的话,supervisor无法重启此服务(关闭主进程时其子进程没有关闭,再开启主进程时会提示端口被占用等错误信息)。
1 | ; 默认为 false,如果设置为 true,当进程收到 stop 信号时,会自动将该信号发给该进程的子进程。如果这个配置项为 true,那么也隐含 killasgroup 为 true。例如在 Debug 模式使用 Flask 时,Flask 不会将接收到的 stop 信号也传递给它的子进程,因此就需要设置这个配置项。 |
这里我们可以看出,虽然supervisor是python2写的,但只要我们指定运行的python3解释器去运行程序就行了。
运行supervisorctl
,即可在shell里面方便的操作,如start app
、restart app
等。
若需要web界面,可在/etc/supervisor/supervisord.conf
内修改,
1 | [inet_http_server] ; inet (TCP) server disabled by default |
重启supervisorctl
后即可在127.0.0.1:9001
见到web界面,
![](/images/2017/07/Screenshot from 2017-07-06 11-49-21.png)
注意事项
- 如果修改了 /etc/supervisord.conf ,需要执行 supervisorctl reload 来重新加载配置文件,否则不会生效。。。
- 很多时候用supervisor管理后台进程容易失败,如
hbase/bin/hbase-daemon.sh start thrift
,这时候可以改用前台进程如/usr/local/hbase/bin/hbase thrift start
。