supervisor进程管理

Supervisor是个客户端/服务器系统可以在类UNIX操作系统上管理一些进程

Supervisord将进程作为其子进程启动,并且可以配置为在崩溃时自动重新启动它们。它还可以自动配置为自行调用启动进程

如果以root用户身份启动Supervisor,则可以允许普通用户控制此类进程。 Supervisorctl允许用户通过简单的shell或Web UI发出”停止”,”启动”和”重新启动”命令来查看进程状态并管理受supervisord控制的子进程

进程通常需要成组地启动和停止,有时甚至需要按照”优先级顺序”执行。 Supervisor允许您为进程分配优先级,并允许用户通过supervisorctl发出命令,如”全部启动”和”全部重新启动”,这将按照预先分配的优先级顺序启动它们。此外,可以将进程分为”进程组”,并且可以将一组逻辑相关的进程作为一个单元停止和启动。

Supervisor 组件

  1. supervisord

supervisor的服务器端为supervisord ,它负责自行调用启动子程序,响应来自客户端的命令,重新启动崩溃或退出的子进程,记录其子进程stdout和stderr输出。
服务进程使用配置文件,通常位于 /etc/supervisord.conf. 这个文件是 “Windows-INI” 类型的配置文件. 保持这个文件在文件系统的安全很重要, 因为它可能包含未加密的用户名和密码。

  1. supervisorctl

supervisor的客户端命令行部分是supervisorctl. 它提供了类似shell的接口访问 supervisord的功能. 通过 supervisorctl用户可以连接不同的 supervisord进程 (同时), 获取子进程的状态, 停止和启动子进程, 获取supervisord正在运行的子进程列表.

  1. Web Server

激活配置文件的[inet_http_server]部分后,可以访问URL(例如http://localhost:9001 )以通过Web界面查看和控制进程状态

安装

1
pip install supervisor

配置

安装完 supervisor 之后,可以运行echo_supervisord_conf 命令输出默认的配置项,也可以重定向到一个配置文件里

1
echo_supervisord_conf > /etc/supervisord.conf

1、主要配置项

1
2
3
4
[supervisord]
logfile=/tmp/supervisord.log ; supervisord 主要的日志文件
[include]
files = /etc/supervisor/*.ini ; 加载需要管理程序的配置文件

2、需要管理程序的配置文件格式如下,例如需要管理elasticsearch的配置文件,命名为 es1.ini,program中的es1代表程序的唯一标识,不能重复

1
2
3
4
5
6
7
8
9
10
11
[program:es1]
command = /home/elastic/elasticsearch-7.4.2/bin/elasticsearch ;启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = es ;启动用户
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 100MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
stdout_logfile = /var/log/es1/es1.log ; stdout日志文件

启动supervisord

1
supervisord -c /etc/supervisord.conf

查看 supervisord 是否在运行:

1
ps aux | grep supervisord

注意

1、后台进程

supervisord 要求管理的程序是非 daemon 程序,supervisord 会帮你把它转成 daemon 程序,因此如果用 supervisord 来管理进程,进程需要以非daemon的方式启动。

例如:管理nginx 的话,必须在 nginx 的配置文件里添加一行设置 daemon off 让 nginx 以非 daemon 方式启动

2、子进程

有时候用 Supervisor 托管的程序还会有子进程(如 Tornado),如果只杀死主进程,子进程就可能变成孤儿进程。通过这两项配置来确保所有子进程都能正确停止:

1
2
stopasgroup=true
killasgroup=true

使用 supervisorctl

supervisorctl 是 supervisord 的一个命令行客户端工具

输入 supervisorctl 进入交互命令

1
2
3
4
5
$ supervisorctl 
> status # 查看程序状态
> stop es1 # 关闭 es1 程序
> start es1 # 启动 es1 程序
> restart es1 # 重启 es1 程序

除了进入 supervisorctl 的 shell 界面,也可以直接在 bash 终端运行

1
2
3
4
$ supervisorctl status
$ supervisorctl stop es1
$ supervisorctl start es1
$ supervisorctl restart es1
踏浪 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!