介绍

Supervisor 是用来在类 Unix 系统中监控和管理进程的工具。在进程意外崩溃退出后可以自动重启程序。

需求

需要使用 root 用户安装 supervisor,同时使用非 root 权限用户运行 supervisor 守护指定进程。

环境

  • CentOS 6.2
  • supervisor-3.3.1

安装

参考官方文档安装:

Installing — Supervisor 3.3.1 documentation

EPEL

pip 包在 epel 库中,所以需要首先安装。

EPEL - FedoraProject

1
yum install -y epel-release

必须执行此步骤,否则在安装 pip 时会提示 Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

1
sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo

Pip

1
yum install -y python-pip

supervisor 安装

必须升级 setuptools 否则无法使用 supervisor

supervisord run got the error ‘pkg_resources.DistributionNotFound: meld3>=0.6.5’ · Issue #3444 · celery/celery · GitHub

1
2
3
4
5
6
7
8
9
pip install --upgrade setuptools
pip install supervisor

echo_supervisord_conf > /etc/supervisord.conf

cat <<EOF >> /etc/supervisord.conf
[include]
files = /etc/supervisor/conf.d/*.conf
EOF

由于默认使用非 root 用户启动服务,所以需要单独配置允许其使用。官方这个 Issue 中提到了解决方法:

Permession denied error when use supervisorctl · Issue #173 · Supervisor/supervisor · GitHub

1
2
3
4
5
groupadd supervisor
usermod -aG supervisor doraemon

sed -i "s/;chmod=0700/chmod=0770/" /etc/supervisord.conf
sed -i "s/;chown=nobody:nogroup/chown=root:supervisor/" /etc/supervisord.conf

系统服务

使用了 GitHub 中他人提供的服务脚本:

https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec

1
2
3
4
5
curl -O https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec
mv redhat-init-equeffelec /etc/init.d/supervisord
chmod +x /etc/init.d/supervisord
chkconfig --levels 235 supervisord on
service supervisord start

chkconfig 中设置的级别可以参考:

Configuring CentOS 6 Runlevels and Services - Techotopia

守护进程配置

pvp_server 默认假定当前目录是文件所在目录,会使用相对路径读取配置文件,所以需要使用 directory 指令修改当前目录。使用 user 指令指定使用指定用户运行。

配置文件格式参考官方文档:

Configuration File — Supervisor 3.3.1 documentation

注意:运行程序前必须保证程序、输出文件、错误文件存在,否则运行出错!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
mkdir -p /var/log/supervisor
touch /var/log/supervisor/test_out.log
touch /var/log/supervisor/test_err.log

mkdir -p /etc/supervisor/conf.d
cat <<EOF >> /etc/supervisor/conf.d/server.conf
[program:test]
command=/test/test
directory=/test
stdout_logfile=/var/log/supervisor/out.log
stderr_logfile=/var/log/supervisor/test_err.log
user=test_user
autostart=true
autorestart=true
startsecs=5
EOF

运行

在配置完成后可以直接使用 supervisorctl reload 加载并运行所有配置好的程序。

supervisorctl 提供了丰富的命令:

1
2
3
4
5
supervisorctl stop program
supervisorctl start program
supervisorctl restart program
supervisorctl status
supervisorctl reload

Running Supervisor — Supervisor 3.3.1 documentation