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 ```
';