centos 6.5, python 2.6, supervisor 3.3.1;
Linux下后台运行程序通常的做法是用nohub,然后配以进程的检测来实现服务式的操作,但其实有更好的选择supervisor,尤其是在多个程序需要管理时;
安装
yum直接安装的版本比较低,推荐使用Python的包安装工具进行安装:
# pip install supervisor
如果没有pip这个命令就:
# yum install python-pip -y
验证安装:
# supervisord -version
3.3.
配置
生成主配置文件:
# echo_supervisord_conf > /etc/supervisord.conf
修改/etc/supervisord.conf末尾的include段:
# vi /etc/supervisord.conf
[include]
files = /etc/supervisord.d/*.ini
把自己的程序配置放到/etc/supervisord.d/里面:
# mkdir -p /etc/supervisord.d/
# vi /etc/supervisord.d/myapp.ini
[program:myapp]
command=/bin/sh /bin/myapp.sh #程序启动命令
autostart=false #是否随supervisord启动
autorestart=false #退出后是否自动重启,可选unexpected表示异常退出时才自动重启
user=root #启动用户
redirect_stderr=false #是否把stderr重定向到stdout
stdout_logfile=/var/log/myapp.stdout #stdout重定向到文件
stderr_logfile=/var/log/myapp.stderr #stderr重定向到文件
这里只写了常用的配置,更多可参考/etc/supervisord.conf中的例子;
下面是程序myapp.sh的内容:
# cat /bin/myapp.sh
#!/bin/sh
n=
while true
do
echo myapp $n
let n++
sleep
done
使用
启动服务(可能会有警告说用了root用户,配置文件不是指定的而是搜索到的,没有影响):
# supervisord
使用命令supervisorctl可以进入supervisor的客户端shell,支持自动补全,输入help查看都有那些命令可用:
也可以用supervisorctl+cmd不进入shell进行操作:
下面介绍常用的命令:
reload 重启supervisord服务
shutdow 停止supervisord服务
maintail [-30/-f] 类似tail命令的方式查看服务进程的控制台输出
status 列出所管理程序的状态
start/stop/restart myapp 启动/停止/重启指定程序
pid 服务进程ID
pid myapp 指定程序的进程ID
tail [-30/-f] myapp 类似tail命令的方式查看指定程序的控制台输出
tips: 如果是Python程序,会发现用print打印的内容supervisorctl tail看不到,原因是缓存,把配置中的command改为python -u myapp.py即可;
分组
程序较多时可以用supervisorctl start all来统一操作,但如果程序较多但又不能统一操作呢?答案是分组,可以统一操作的分到一个组;
分组是在配置了program的基础上进行的,根据上节的内容,假设配置了两个program:
[program:myapp1]
[program:myapp2]
来把这两个配置为一个组app:
# vi /etc/supervisord.d/app.ini
[group:app]
programs=myapp1,myapp2
在supervisor的shell中操作分组:
tips:分组后,单个操作时需要带上组名:supervisorctl tail app:myapp1;
over