使用Supervisor管理Linux进程

概述

什么是Supervisor?

Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.

It shares some of the same goals of programs like launchd, daemontools, and runit. Unlike some of these programs, it is not meant to be run as a substitute for init as “process id 1”. Instead it is meant to be used to control processes related to a project or a customer, and is meant to start like any other program at boot time.

译文。

Supervisor是一个允许用户监控类UNIX操作系统上若干进程的C/S系统。

它虽然有一些类似于launchd,daemontools,以及runit的功能。但不像这些程序,它并不是以替身的形式运行的。相反它意在用于控制与一个工程或者一个资源消耗者相关的进程,当然它跟其他程序一样也是随系统启动而启动。

Ubuntu下安装Supervisor

以root身份,运行以下命令。

1
> apt-get install supervisor

启动服务即可。

1
2
> supervisord
# 也可以输入service supervisor restart

一个简单的Shell

为了演示,我们写了如下Shell脚本(/home/test/long.sh)。

1
2
3
4
5
6
7
do
# Echo current date to stdout
echo 'date'
# Echo 'error!' to stderr
echo 'error!' >$2
sleep 1
done
1
> chmod +x /home/test/long.sh

运行long.sh。会输出当前时间和『error!』字符串。这就是我们要交给Supervisor管理的Shell脚本。

Supervisor配置

Supervisor的默认配置文件是/etc/supervisor/supervisord.conf,同时,默认包含了/etc/supervisor/conf.d/路径下的所有.conf文件。

这里我们添加一个新的配置文件:/etc/supervisor/conf.d/long_script.conf文件,如下所示。

1
2
3
4
5
6
[program:long_script]
command=/home/test/long.sh
autostart=true
autorestart=true
stderr_logfile=/home/test/long.err.log
stdout_logfile=/home/test/long.out.log
1
2
[program:long_script]
command=/home/test/long.sh

Supervisor管理的程序名为long_script。
脚本路径是/home/test/long.sh,Supervisor会去运行它。

1
2
autostart=true
autorestart=true

autostart表示程序是否随系统启动而启动。
autorestart表示程序是否一停止了就立刻再启动。

1
2
stderr_logfile=/home/test/long.err.log
stdout_logfile=/home/test/long.out.log

这两个文件是我们输出的日志文件。

启动Supervisor

配置文件创建好了之后,我们可以用supervisorctl命令告诉Supervisor新的程序已经添加好了。首先我们先告知Supervisor看看在/etc/supervisor/conf.d/路径下有没有新建或者更新的配置文件。

1
> supervisorctl reread

然后更新这些变化。

1
> supervisorctl update

如果不出意外的话能应该成功看到结果了。

1
2
3
4
5
6
7
8
9
10
11
> tail /home/test/long.out.log
Tue Apr 19 15:30:09 CST 2016
Tue Apr 19 15:30:10 CST 2016
Tue Apr 19 15:30:11 CST 2016
Tue Apr 19 15:30:12 CST 2016
Tue Apr 19 15:30:13 CST 2016
Tue Apr 19 15:30:14 CST 2016
Tue Apr 19 15:30:15 CST 2016
Tue Apr 19 15:30:16 CST 2016
Tue Apr 19 15:30:17 CST 2016
Tue Apr 19 15:30:18 CST 2016
1
2
3
4
5
6
7
8
9
10
11
> tail /home/test/long.err.log
error!
error!
error!
error!
error!
error!
error!
error!
error!
error!

几个常见的命令

1
2
3
4
5
6
7
8
supervisorctl help # 帮助文档,输出所有命令列表;也可指定命令,查看具体帮助文档,如:supervisorctl help reread。
supervisorctl reread # 重新读入配置,查看是否有变化。
supervisorctl update # 更新配置,根据新的配置启动新的程序或对已有进程进行其他操作。
supervisorctl reload # 重启Supervisor。
supervisorctl start PROGRAM_NAME # 启动名为PROGRAM_NAME的程序。
supervisorctl stop PROGRAM_NAME # 关闭名为PROGRAM_NAME的程序。
supervisorctl status # 查看所有程序状态列表。
supervisorctl # 进入Supervisor控制台,在控制台下上述命令同样使用,控制台下需要把前面的supervisorctl删掉,直接输入reread,update……退出时输入quit。

一点使用心得

Supervisor的日志文件路径在/var/log/supervisor/路径下。

Supervisor是一个C/S结构的程序,也就是说可以通过远程直接控制服务器上又Supervisor管理的程序,笔者对Supervisor这方面并不了解,不过出于安全考虑,笔者习惯不使用Supervisor的远程管理功能,通过SSH连接服务器后再对Supervisor管理的程序进行操作。

参考

  1. Supervisor: A Process Control System
  2. How To Install and Manage Supervisor on Ubuntu and Debian VPS