0%

记录-Supervisor使用

Pre:

Centos7不推荐使用rc.local,推荐自己配service但因为之前用惯了Cenos6,故一开始也沿用rc.local.

后来rc.local启的进程会导致系统无法正常快速的reboot,然后就频繁断电操作(虽然是虚拟机)…导致系统的硬盘崩了…

为了更好的管理进程,所以选用supervisor这个工具.

理由参考这篇文章的介绍(进程管理工具supervisor简介及使用技巧)

经常碰到要跑一些守护进程。平常我的做法是开一个tmux软件或者screen,然后启动软件。如果有其他人问,我则会建议用nohup your-program &>nohup.log &这种方式。

可是这种做法毕竟不是长久之计,机器重启或者不小心kill了某个进程,后台运行的这个进程可能就不小心死掉了。

后来开源界的大牛建议我用supervisor。尝试之后,简直是如获至宝。作为一个存在了长达10年多的进程管理软件,他已经相当成熟。


Supervisor组成部分:

  1. supervisord: 服务守护进程:
    supervisor服务器的进程名是supervisord。它主要负责在自己的调用中启动子程序,响应客户端的命令,重新启动崩溃或退出的进程,记录其子进程stdout和stderr的输出,以及生成和处理对应于子进程生命周期中的"event"服务器进程使用的配置文件,通常路径存放在/etc/supervisord.confa中。此配置文件是INI格式的配置文件。

  2. supervisorctl:命令行客户端:
    supervisor命令行的客户端名称是supervisorctl。它为supervisord提供了一个类似于shell的交互界面。使用supervisorctl,用户可以查看不同的supervisord进程列表,获取控制子进程的状态,如停止和启动子进程

  3. Web Server:提供与supervisorctl功能相当的WEB操作界面一个可以通过Web界面来查看和控制进程的状态,默认监听在9091上。

  4. XML-RPC Interface:XML-RPC接口
    supervisor用于控制的XML-RPC接口


安装&初始化:

1
2
# 安装
/usr/local/bin/pip2.7 install supervisor
1
2
# 初始化配置文件
/usr/local/bin/echo_supervisord_conf > /xxx/supervisord.conf

编辑配置文件:

编辑supervisord.conf

示例:

1
2
3
4
5
6
7
8
[program:program_name]

command = 运行命令xxx
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false

配置项有很多…


tips:

supervisor crash when config command include java “%t %p” variable

如果在运行的命令中有用到%,会报格式错误.这个时候只需要双写%%%就好了.


基本操作命令:

启停supervisor:

1
2
# 启动
supervisord -c /etc/supervisord.conf
1
2
# 停止
supervisorctl /etc/supervisord.conf shutdown
1
2
# 重载
supervisorctl /etc/supervisord.conf reload

管理进程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动
supervisorctl -c /etc/supervisord.conf start program_name

# 停止
supervisorctl -c /etc/supervisord.conf stop program_name

# 重启
supervisorctl -c /etc/supervisord.conf restart program_name

# 停止全部进程
supervisorctl -c /etc/supervisord.conf stop all

# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl -c /etc/supervisord.conf update

加入启动项:

centos7环境下

1
2
# 创建文件
vim /usr/lib/systemd/system/supervisord.service

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# supervisord service for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl -c /etc/supervisord.conf shutdown
ExecReload=/usr/bin/supervisorctl -c /etc/supervisord.conf reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
1
2
# 设置权限
chmod 755 /usr/lib/systemd/system/supervisord.service
1
2
# 激活开机启动命令
systemctl enable supervisord.service
1
2
3
4
5
6
7
8
9
# 启动supervisor进程
systemctl start supervisord

# 关闭supervisor进程
systemctl stop supervisord

# 如果修改了supervisor.service文件,可以通过reload命令来重新加载配置文件
systemctl reload supervisord


定期重启指定进程方法

Supervisor配合crontab可定期重启.

例:每小时重启进程abc

1
0 * * * * supervisorctl -c /etc/supervisord.conf restart abc

总结:

初步使用的感觉是,配置起来不麻烦,要重启进程的话也很方便,不用在手打冗长的命令.

但是配置项不算少,要真正用得好,还是要在实践中慢慢定下适合自己程序的配置项.

配置项的介绍可以参考Supervisor文档


refs: