Supervisor 使用笔记

Supervisor 是一个用 Python 写在类 UNIX 中的进程管理工具,可以很方便的用来启动、重启、关闭控制许多进程。Supervisor易于学习,配置文件很简单;它集中管理进程;通过 fork/exec 启动子进程并对它高效控制;它兼容除 windows 外的类 UNIX 系统,在Linux,Mac OS X,Solaris和FreeBSD上经过测试和支持。

Supervisor 拥有服务端 supervisord 和客户端 supervisorctl

安装

使用 Python 包管理工具 pip 安装

1
pip install supervisor

创建配置文件

安装完成后,你就可以运行命令 echo_supervisord_conf 来打印 Supervisor 的配置样例。然后你就可以再运行echo_supervisor_conf > /etc/supervisord.conf 来创建配置文件,启动时会默认读取文件/etc/supervisord.conf。或者在启动时指定 -c 参数来指定配置文件的路径。

配置文件创建完成后,可按照你自己的需求来自行配置文件。

运行

运行 supervisord

1
supervisord -c /etc/supervisord.conf

supervisord 命令行参数

参数 说明
-c FILE, –configuration=FILE supervisord 配置文件路径
-n, –nodaemon 在前台运行 supervisord
-h, –help 命令行帮助信息
-u USER, –user=USER UNIX 用户名或数字标识。以什么用户来运行 supervisord
-m OCTAL, –umask=OCTAL 设置 umask 如:022
-d PATH, –directory=PATH 当supervisord作为守护进程运行时,在守护进程之前 cd 到此目录。
-l FILE, –logfile=FILE 指定 supervisord 的日志路径
-y BYTES, –logfile_maxbytes=BYTES 日志最大占用空间 默认字节。如:’1’ 为1字节,’1MB’为1兆字节,’1GB’为1千兆字节
-z NUM, –logfile_backups=NUM 日志备份数
-e LEVEL, –loglevel=LEVEL 日志记录级别。trace, debug, info, warn, error, critical
-j FILE, –pidfile=FILE supervisord 启动时的 pid 写入的文件路径
-i STRING, –identifier=STRING
-q PATH, –childlogdir=PATH
-k, –nocleanup
-a NUM, –minfds=NUM 启动前,supervisord 可用的文件描述符数
-t, –strip_ansi
-v, –version 打印版本号
–profile_options=LIST
–minprocs=NUM 在成功启动之前,supervisord进程可用的最小OS进程槽数

运行 supervisorctl

supervisorctl 命令行参数

参数 说明
-c, –configuration 配置文件路径(默认为/etc/supervisord.conf)
-h, –help 命令行帮助信息
-i, –interactive 启动交互式 shell
-s, –serverurl URL supervisord服务器正在侦听的URL(默认为”http://localhost:9001"
-u, –username 身份验证用户名
-p, –password 身份验证密码
-r, –history-file 保留历史记录?

supervisorctl Actions

Action 说明
help 帮助信息
help <action> 打印 action 的帮助信息
add <name> […] 更新进程或组的配置
remove <name> […] 删除进程或组的配置
update 重新加载配置,重启受影响的进程
update all 重新加载配置,重启受影响的进程
update <gname> […] 更新指定组,重启受影响的进程
clear <name> 清除进程日志文件
clear <name> <name> 清除多个进程日志文件
clear all 清除所有进程日志文件
fg <process> 进入一个进程的前端界面,然后按 Ctrl+C 退出
pid 获得supervisord的PID
pid <name> 按名称获取单个子进程的PID
pid all 获取每个子进程的PID,每行一个
reload 重新启动
reread 重新加载守护进程的配置文件
restart <name> 重新启动进程。注意:重新启动不会重新读取配置文件
restart <gname>:* 重新启动组中所有进程。注意:重新启动不会重新读取配置文件
restart <name> <name> 重新启动多个进程或组。注意:重新启动不会重新读取配置文件
restart all 重新启动所有进程。注意:重新启动不会重新读取配置文件
signal 没有信号帮助?
start <name> 启动一个进程
start <gname>:* 启动组中所有进程
start <name> <name> 启动多个进程和组
start all 启动所有进程
status 获取所有进程状态
status <name> 按名称获取一个进程状态
status <name> <name> 获取多个进程状态
stop <name> 停止一个进程
stop <gname>:* 停止组中所有进程
stop <name> <name> 停止多个进程和组
stop all 停止所有进程
tail [-f] <name> [stdout | stderr] (default stdout) 输出进程日志

信号

可以发送信号到 supervisord 以执行某些动作。可以将信号发送到单个 supervisord 进程,此进程标识可以在配置文件的 [supervisord] 部分中的 pidfile 参数找到

  • SIGTERM

    supervisord 及其所有子进程将关闭。这可能需要几秒钟。

  • SIGINT

    supervisord 及其所有子进程将关闭。这可能需要几秒钟。

  • SIGQUIT

    supervisord 及其所有子进程将关闭。这可能需要几秒钟。

  • SIGHUP

    supervisord 将停止所有进程,重新加载配置文件并启动所有进程。

  • SIGUSR2

    supervisord 将重新打开主日志和所有子日志。

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
;*为必须填写项
;*[program:应用名称]
[program:cat]
;*命令路径,如果使用python启动的程序应该为 python /home/test.py,
;不建议放入/home/user/, 对于非user用户一般情况下是不能访问
command=/bin/cat
;当numprocs为1时,process_name=%(program_name)s
;当numprocs>=2时,%(program_name)s_%(process_num)02d
process_name=%(program_name)s
;使用supervisor还有一个更大的好处就是,可以快速开启多个进程,配置参数如下:
;进程数量,表示对同一个配置开启1个线程。
numprocs=1
;执行目录,若有/home/supervisor_test/test1.py
;将directory设置成/home/supervisor_test
;则command只需设置成python test1.py
;否则command必须设置成绝对执行目录
directory=/tmp
;掩码:--- -w- -w-, 转换后rwx r-x w-x
umask=022
;优先级,值越高,最后启动,最先被关闭,默认值999
priority=999
;如果是true,当supervisor启动时,程序将会自动启动
autostart=true
;*自动重启
autorestart=true
;启动延时执行,默认1秒
startsecs=10
;启动尝试次数,默认3次
startretries=3
;当退出码是0,2时,执行重启,默认值0,2
exitcodes=0,2
;停止信号,默认TERM
;中断:INT(类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐)
;终止:TERM(kill -TERM pid)
;挂起:HUP(kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同
;从容停止:QUIT(kill -QUIT pid)
;KILL, USR1, USR2其他见命令(kill -l),说明1
stopsignal=TERM
stopwaitsecs=10
;*以root用户执行
user=root
;有时候用 Supervisor 托管的程序还会有子进程(如 Tornado),如果只杀死主进程,子进程就可能变成孤儿进程。
;通过这两项配置(改为true)来确保所有子进程都能正确停止,默认是false:
stopasgroup=false
killasgroup=false
;重定向,把stderr重定向到stdout,默认false;
redirect_stderr=false
;标准日志输出
stdout_logfile=/a/path
;标准日志文件大小,默认50MB
stdout_logfile_maxbytes=1MB
;标准日志文件大小,默认50MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
;标准日志输出
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
;环境变量设置
environment=A="1",B="2"
serverurl=AUTO

参考

0%