supervisor

Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启.

supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.另一个进程管理工具:S6

Debian / Ubuntu可以直接通过apt安装:

1
sudo apt-get install supervisor

如果是通过pip安装的话,就需要echo_supervisord_conf程序生成supervisor的初始化配置文件:

1
2
3
sudo pip install supervisor
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

supervisor安装完成后会生成三个执行程序:supervisortd 守护进程服务,用于接收进程管理命令.supervisorctl 客户端,用于和守护进程通信,发送管理进程的指令.
echo_supervisord_conf 生成初始配置文件程序
然后,给我们自己开发的应用程序编写一个配置文件,让supervisor来管理它.每个进程的配置文件都可以单独分拆,放在/etc/supervisor/conf.d/目录下,以.conf作为扩展名

vim server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[program:python8010]
command = /usr/bin/python3 HttpsRunner.py
directory = /server/app1.6
user = root
redirect_stderr = true
stdout_logfile_maxbytes = 150MB
stdout_logfile_backups = 20
stdout_logfile = /server/app1.6/python8010.log
[program:mongod]
;command = /mongo/mongodb-linux-x86_64-ubuntu1404-3.2.10/bin/mongod --dbpath /mnt/mongodb --auth
command = /mongo/mongodb-linux-x86_64-ubuntu1404-3.2.10/bin/mongod -f /server/app1.6/mongodb.conf
directory = /server/app1.6
user = root
redirect_stderr = true
stdout_logfile_maxbytes = 150MB
stdout_logfile_backups = 20
stdout_logfile = /server/app1.6/mongodb.log

Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程.否则提示Exited too quickly (process log may have details)异常.
启动Supervisor服务:

1
supervisord -c /etc/supervisor/supervisord.conf

管理进程:

1
2
3
4
5
6
7
8
9
10
11
12
13
supervisorctl status
supervisorctl stop mongod
supervisorctl start python8010
supervisorctl restart python8001
# 重启所有属于名为groupworker这个分组的进程(start,restart同理)
supervisorctl stop groupworker
# 停止全部进程,注:start、restart、stop都不会载入最新的配置文件
supervisorctl stop all
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl reread/reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl update
supervisorctl tail <APP_NAME>

进入CLI管理台:

1
supervisorctl

Web管理界面

1
2
3
4
5
vim /etc/supervisor/supervisord.conf
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface)
username=root ; (default is no username (open server))
password=root ; (default is no password (open server))

重启Supervisor服务,如果有Unlinking stale socket /var/run/supervisor.sock 执行unlink /var/run/supervisor.sock:

1
2
ps aux |grep supervisord
supervisord -c /etc/supervisor/supervisord.conf
开机启动Supervisor:

方法1:
Linux 在启动的时候会执行 /etc/rc.local 里面的脚本,所以只要在这里添加执行命令就可以
以下内容需要添加在 exit 命令前,而且由于在执行 rc.local 脚本时,PATH 环境变量未全部初始化,因此命令需要使用绝对路径.

1
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf

如果是 Ubuntu 16.04 以上,rc.local 被当成了服务,而且默认是不会启动,需要手动启用一下服务

启动rc.local服务:

1
sudo systemctl enable rc-local.service

方法二:
Supervisord 默认情况下并没有被安装成服务,它本身也是一个进程.官方已经给出了脚本可以将 Supervisord 安装成服务,
可以参考这里查看各种操作系统的安装脚本,但是我用官方这里给的 Ubuntu 脚本却无法运行.
安装方法可以参考 serverfault
这个脚本下载下来后,还需检查一下与我们的配置是否相符合,比如默认的配置文件路径,pid 文件路径等,如果存在不同则需要进行一些修改

Share Comments