进程管理工具 supervisor 简介
Supervisor 是一个客户端服务器系统,包含有两个程序
- Supervisor 的 server 部分称为 supervisord。主要负责管理子进程,响应客户端的命令,log 子进程的输出,创建和处理不同的事件
- Supervisor 的命令行客户端 supervisorctl。它可以与不同的 supervisord 进程进行通信,获取子进程信息,管理子进程
supervisor 的官网地址是 http://supervisord.org/ 我的大部分资料也是来自这里。
优点
相比较传统的方式,supervisor 用很多好处
简单
通常管理 linux 进程的时候,一般来说都需要自己编写一个能够实现进程 start/stop/restart/reload 功能的脚本,然后丢到/etc/init.d/下面。这么做有很多不好的地方,第一我们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时候,linux 不会自动重启它的,想要自动重启的话,我们还要自己写一个监控重启脚本。而,supervisor 则可以完美的解决这些问题。
进程组
supervisor 可以对进程组统一管理,也就是说咱们可以把需要管理的进程写到一个组里面,然后我们把这个组作为一个对象进行管理,如启动,停止,重启等等操作。而 linux 系统则是没有这种功能的,我们想要停止一个进程,只能一个一个的去停止,要么就自己写个脚本去批量停止。
有效性
当 supervisor 的子进程挂掉的时候,操作系统会直接给 supervisor 发信号。而其他的一些类似 supervisor 的工具,则是通过进程的 pid 文件,来发送信号的,然后定期轮询来重启失败的进程。显然 supervisor 更加高效。
安装
先从安装说起。
官网建议 debain 或者 ubuntu 使用 apt-get 安装。 请注意,千万不要这么干 软件源的版本是 3.0a8,这个版本有个坑爹的 bug,stopasgroup 这个设置没有用。
正确的安装方法, 安装完后版本应该 >= 3.1
sudo pip install -U supervisor
sudo echo_supervisord_conf > /etc/supervisord.conf
这个配置文件大部分都不用改,有个地方最好还是改下
[include]
files = supervisor-conf.d/*.ini
然后mkdir /etc/supervisor-conf.d
, 各个程序的配置都放到这个目录下。这样安排比较合理一些。
弄完后,启动服务端supervisord -c /etc/supervisord.conf
。 接着运行sudo supervisorctl status
,如果没有报错,就说明服务端启动正常了。
添加程序
首先需要准备一个配置文件(如 hellod.ini)。放到 /etc/supervisor-conf.d/
目录下。分号;
后面的是注释
文件的内容要遵循 ini 配置文件的规范。下面是个例子,这个例子基本上是通用的,需要改的部分只要上面 4 行
[program:hello]
directory=/home/codeskyblue/hello
command=python hello.py
user=codeskyblue
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=TERM
stopasgroup=true
user 代表运行的账户,program:hello, 其中 hello 是这个 supervisor 中的名字,方便控制。
其中 stopasgroup 代表的意思是 如果停止,将其相关的子进程也一起杀掉。
其实不妨写个 shell 脚本来生成配置文件,更快一些。贴上我写的一个生成配置的脚本。
#!/bin/sh
# gensvconf.sh
NAME=$(basename $PWD)
COMMAND=$@
USER=$(whoami)
cat > supervisor.ini <<EOF [program:$NAME]
directory=$PWD command=$COMMAND user=$USER autostart=true
autorestart=true
redirect_stderr=true
stopsignal=TERM
stopasgroup=true EOF
hello.py 的内容很简单
#!/usr/bin/env python
# -*- coding: utf-8 -*- import sys, time
n = 0
while True:
print >>sys.stdout, 'hello: %d' % n
sys.stdout.flush()
n += 1
time.sleep(1.0)
把生成的配置文件,拷贝过去,更新下 supervisor 的配置就好了。
cp supervisor.ini /etc/supervisor-conf.d/hello.ini
supervisorctl update
supervisorctl status # 查看hello是否正常运行
正常情况下应该会显示
hello RUNNING pid 30096, uptime 0:02:30
还有一些其他的常用命令(这里我默认你用 root,所以我省去了 sudo)
supervisorctl tail hello
可以查看进程的输出supervisorctl reread hello
重新加载 hello 的配置supervisorctl remove hello
只有在 hello 停止运行的时候,才可以。这句是将 hello 从进程守护列表中移除
还有一个技巧,修改一个配置文件/etc/supervisor.conf
的一个地方
[unix_http_server]
file=/var/run//supervisor.sock
chmod=0777 ; 原来是chmod=0700
改完之后,sudo supervisorctl reload
重新加载下配置。 这时在非 root 用户下,也可以自由的使用 supervisorctl 了
HTTP 服务
加入如下两行到/etc/supervisord.conf
中
[inet_http_server]
port = :9001
supervisorctl reload
重新加载配置。打开浏览器输入 http://localhost:9001
, 应该就会看到这个页面了,网页上的功能也很全。