JasonYeung 2019-06-27
Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。
可以说是很好的替换的系统的nohup ...... &
或系统服务systemd
Supervisor相当强大,提供了很丰富的功能,不过我们可能只需要用到其中一小部分。安装完成之后,可以编写配置文件,来满足自己的需求。为了方便,我们把配置分成两部分:supervisord
(supervisor是一个C/S模型的程序,这是server端,对应的有client端:supervisorctl
)和应用程序(即我们要管理的程序)。
Supervisor 只能管理在前台运行的程序,所以如果应用程序有后台运行的选项,需要关闭。
Setuptools
软件包来安装sudo yum -y install python-setuptools sudo easy_install supervisor
supervisord -v
3.3.4
默认安装的版本是最新版(3.3.4)
supervisord.conf
,如果不加路径则默认生成到用户目录~/supervisord.conf
echo_supervisord_conf > supervisord.conf
mkdir ~/developer/supervisor mkdir ~/developer/supervisor/conf.d mv ~/supervisord.conf ~/developer/supervisor
vim ~/developer/supervisor/supervisord.conf
修改include
配置,去除注释,include
中的files
为自己的配置文件存放地址。
[include] files = /home/ling/developer/supervisor/conf.d/*.conf
conf.d
为应用的配置文件存放目录sudo supervisord -c ~/developer/supervisor/supervisord.conf
ps -ef | grep supervisord ling 3419 1 0 02:50 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /home/ling/developer/supervisor/supervisord.conf
sudo supervisorctl shutdown
配置说明
;*为必须填写项 ;*[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
supervisorctl
使用修改的配置文件生效,设置autostart=true
的程序,会自动启动
sudo supervisorctl update
或
sudo supervisorctl reload
sudo supervisorctl status
sudo supervisorctl start all
sudo supervisorctl stop all
sudo supervisorctl restart all
all
换成相应的program名称,则就是对相应的程序进行启动、关闭和重启以Jenkins为例启动进程
vim /home/ling/developer/supervisor/conf.d/jenkisn.conf
,写入如下内容[program:jenkins] command=java -jar jenkins.war --httpPort=8888 process_name=%(program_name)s numprocs=1 directory=/home/ling/developer/jenkins user=ling autostart=true autorestart=true startsecs=10 startretries=5 redirect_stderr = true stdout_logfile=/home/ling/developer/jenkins/logs/jenkins-out.log stderr_logfile=/home/ling/developer/jenkins/logs/jenkins-err.log stdout_logfile_maxbytes = 20MB stdout_logfile_backups = 20
sudo supervisorctl update
jenkins: added process group
sudo supervisorctl status
jenkins RUNNING pid 4555, uptime 19:21:53
supervisord
的默认配置文件是放在/etc/supervisord.conf
下面的,如果使用supervisorctl
无法找到配置文件,supervisorctl
无法获知与supervisord
该如何通讯,使用supervisorctl
时你可能会看到如下错误
http://localhost:9001 refused connection
处理解决办法:
-c
指定配置文件位置supervisorctl -c /path/to/supervisord.conf status
/etc
目录下ln -s /path/to/supervisord.conf /etc/本文首发于凌风博客:Supervisor进程管理工具安装配置