supervisor是使用Python编写的进程管理软件,在实际开发中,一般用它来同时开始一批相关的进程,无论是Django的runserver还是直接管理Nginx、Apache等,都比较方便,这里是其使用方法:
安装supervisor
1 | ubuntu |
使用
- 初次安装supervisor由于系统不同安装版本不同,可能没有自动生成配置文件,一定要手动去生成一次,因为你并不知道配置文件里面哪些是必须的…
1 | sudo easy_install supervisor |
配置
- 需要注意的是用supervisor管理的进程千万不要开启daemon模式,否则supervisor会认为程序没有启动成功,导致无限开进程…
全局配置
1 | [supervisord] |
进程配置
1 | 在supervisord.conf里面添加如下内容 |
这样就创建了一个进程,进程的名称为frontend。
由于ubuntu上面supervisor的配置文件可以放在/etc/supervisor.d/*.ini
里面比较方便,但是会出现一些错误。如果是单独的ini文件,那么不仅要写program
这个section还应该把supervisord
、supervisorctl
两个区块都加上,哪怕不写任何东西。
supervisorctl常用命令:
1 | supervisorctl start name # 开始一个进程 |
TroubleShooting
安装过程出现
unix:///var/run/supervisor.sock no such file
:1
2
3
4
5
6
7
8
9
10
11首先删除通过apt-get安装的supervisor
sudo apt-get remove supervisor
然后把相应的进程kill掉
sudo ps -ef | grep supervisor
最后直接用easy_install安装
sudo easy_install supervisor
然后生成配置文件
sudo echo_supervisor_conf > /etc/supervisord.conf
最后启动
sudo supervisord
sudo supervisorctl**执行
sudo supervisorctl reload
**时出现错误error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224
原因是supervisor没有启动而重启造成的,我也不知道为什么报的错误会是这个错误。这时候只需要启动supervisor即可supervisor守护的进程没有将标准输出输出到指定的地方: 原因一般是程序本身有输出缓存,特别是python程序,这时候要么在每次
print
之后通过sys.stdout.flush()
,刷新缓冲区,要么直接print(msg, flush=True)
,最好的办法是在命令上加上-u
参数表示不缓冲,例如command = python -u run.py
修改完配置文件supervisor.conf后重启不生效: 执行这两条命令,重新读取配置文件
1
2supervisorctl reread
supervisorctl update