supervisor [python]
最后更新于:2022-04-02 03:49:25
[TOC]
> [参考](https://www.restran.net/2015/10/04/supervisord-tutorial/)
> [官方文档](http://supervisord.org/configuration.html#unix-http-server-section-values)
## 开启启动
`vim /etc/rc.local`
```
/usr/bin/supervisord -c /etc/supervisord.conf
```
## root 启动 supervisord
再在配置文件中对不同服务使用不同用户
## 执行程序
`supervisord`,运行 Supervisor 时会启动一个进程 supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。
`supervisorctl`,是命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理
## 默认配置文件
程序自动会找
`/etc/supervisord.conf`是否存在配置
## 避免默认 `supervisord.pid`,` supervisor.sock` 放在 `/tmp`目录
创建文件夹
```
mkdir /home/supervisor
mkdir /var/log/supervisor
mkdir /etc/supervisor.d
```
```
[unix_http_server]
file=/home/supervisor/supervisor.sock ; (the path to the socket file)
[supervisord]
pidfile=/home/supervisor/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
[supervisorctl]
serverurl=unix:///home/supervisor/supervisor.sock ; use a unix:// URL for a unix socket
```
## 使用浏览器来管理
```
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for ;all iface)
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))
[supervisorctl]
serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
username=chris ; should be same as http_username if set
password=123 ; should be same as http_password if set
```
## `[supervisord]` 配置
```
[supervisord]
logfile = /home/supervisor/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /home/supervisor/supervisord.pid
nodaemon = false ;如果为true,则supervisor将在前台启动而不是守护进程
minfds = 1024
minprocs = 200
umask = 022
user = chrism
identifier = supervisor
directory = /tmp
nocleanup = true
childlogdir = /tmp
strip_ansi = false
environment = KEY1="value1",KEY2="value2"
```
## `[supervisorctl]` 配置
```
[program:theprogramname]
command=/bin/cat ; 程序(相对的使用PATH,可以接受args)
process_name=%(program_name)s ; process_name expr (默认%(program_name)s)
numprocs=1 ;numprocs=1;要启动的进程拷贝数 (def 1)
directory=/tmp ;目录=/tmp;执行前要转到 cwd 的目录 (def no cwd)
umask=022 ;进程的umask(默认为None)。
priority=999 ;相对的启动优先级(默认999)
autostart=true ;从supervisord开始(默认值:true)。
autorestart=unexpected ; 是否/何时重启(默认值:意外)
startecs=1 ; prog必须保持运行的秒数 (def. 1)
startretries=3 ;startretries=3;最大序列启动失败次数(默认为3)
exitcodes=0,2 ;exitcodes=0,2;进程的'预期'退出代码(默认为0,2)
stopignal=QUIT ;用于杀死进程的信号(默认为term)。
stopwaitsecs=10 ;stopwaitsecs=10;最大等待sigkill (默认为10)
stopasgroup=false ;向UNIX进程组发送停止信号(默认为false)。
killasgroup=false ; SIGKILL UNIX进程组(def false)
user=chrism ;setuid到这个UNIX账户,以运行程序。
redirect_stderr=true ; 重定向 proc stderr 到 stdout (默认为 false)
stdout_logfile=/a/path ; stdout_logfile=/a/path ; stdout log path, NONE for none ; default AUTO
stdout_logfile_maxbytes=1MB ;stdout_logfile_maxbytes=1MB ;max # logfile b4轮转前的最大字节数 (默认为50MB)
stdout_logfile_backups=10 ; # stdout日志文件备份的数量(默认为10)
stdout_capture_maxbytes=1MB ; 'capturemode'中的字节数(默认为0)
stdout_events_enabled=false ; stdout_events_enabled=false ; 在stdout写入时发射事件(默认为false)
stderr_logfile=/a/path ; stderr_logfile=/a/path ; stderr日志路径,NONE表示无 ;默认为AUTO
stderr_logfile_maxbytes=1MB ;stderr_logfile_maxbytes=1MB ;max # logfile b4轮转前的最大字节数 (默认为50MB)
tderr_logfile_backups=10 ; stderr_logfile_backups=10 ; # stderr logfile的备份数(默认为10)
stderr_capture_maxbytes=1MB ; 'capturemode'中的字节数(默认为0)
stderr_events_enabled=false ; stderr_events_enabled=false; 在stderr写入时发射事件(默认为false)
environment=A="1",B="2" ; 处理环境添加(def no adds)
serverurl=AUTO ; 覆盖serverurl计算(childutils)
```
demo:
```
; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:your_program_name]
command=python server.py --port=9000
;numprocs=1 ; 默认为1
;process_name=%(program_name)s ; 默认为 %(program_name)s,即 [program:x] 中的 x
directory=/home/python/tornado_server ; 执行 command 之前,先切换到工作目录
user=oxygen ; 使用 oxygen 用户来启动该进程
; 程序崩溃时自动重启,重启次数是有限制的,默认为3次
autorestart=true
redirect_stderr=true ; 重定向输出的日志
stdout_logfile = /var/log/supervisor/tornado_server.log
loglevel=info
```
### 添加主进程来开启多个相似进程
```
[program:web]
environment=port=":505%(process_num)d"
command = ./main
numprocs=2
process_name=web_%(process_num)d
```
port 为 `5051`,`5052`
## `[group:x]` 配置
```
[group:foo]
programs=bar,baz
priority=999
```
';