介绍
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