博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用supervisor管理后台进程
阅读量:3986 次
发布时间:2019-05-24

本文共 5722 字,大约阅读时间需要 19 分钟。

Linux

1、安装

yum install -y epel-releaseyum install -y supervisor

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。supervisord 要求管理的程序是非 daemon 程序,supervisord 会帮你把它转成 daemon 程序。

2、使用

supervisor配置文件:/etc/supervisord.conf

子进程配置文件:/etc/supervisord.d/
注:默认子进程配置文件为ini格式,可在supervisor主配置文件中修改。

supervisord.conf配置文件说明:

[unix_http_server]file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用;chmod=0700                 ;socket文件的mode,默认是0700;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid ;[inet_http_server]         ;HTTP服务器,提供web管理界面;port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性;username=user              ;登录管理后台的用户名;password=123               ;登录管理后台的密码 [supervisord]logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.loglogfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份loglevel=info                ;日志级别,默认info,其它: debug,warn,tracepidfile=/tmp/supervisord.pid ;pid 文件nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动minfds=1024                  ;可以打开的文件描述符的最小值,默认 1024minprocs=200                 ;可以打开的进程数的最小值,默认 200 [supervisorctl]serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord ; [program:xx]是被管理的进程配置参数,xx是进程的名称[program:xx]command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令autostart=true       ; 在supervisord启动的时候也自动启动startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启startretries=3       ; 启动失败自动重试次数,默认是3user=tomcat          ; 用哪个用户启动进程,默认是rootpriority=999         ; 进程启动优先级,默认999,值小的优先启动redirect_stderr=true ; 把stderr重定向到stdout,默认falsestdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MBstdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.outstopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程 ;包含其它配置文件[include]files = supervisord.d/*.ini    ;可以指定一个或多个以.ini结束的配置文件

全局配置文件几乎不用改动。

子进程配置文件说明:

给需要管理的子进程(程序)编写一个配置文件,放在/etc/supervisor.d/目录下,以.ini作为扩展名(每个进程的配置文件都可以单独分拆也可以把相关的脚本放一起)。如任意定义一个和脚本相关的项目名称的选项组(/etc/supervisord.d/test.ini):

#项目名[program:blog]#脚本目录directory=/opt/bin#脚本执行命令command=/usr/bin/python /opt/bin/test.py#supervisor启动的时候是否随着同时启动,默认Trueautostart=true# 当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,# unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码# 不在下面的exitcodes里面定义的autorestart=true#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1startsecs=3#脚本运行的用户身份 user = root#日志输出 stderr_logfile=/tmp/blog_stderr.log stdout_logfile=/tmp/blog_stdout.log #把stderr重定向到stdout,默认 falseredirect_stderr = true#stdout日志文件大小,默认 50MBstdout_logfile_maxbytes = 20M#stdout日志文件备份数stdout_logfile_backups = 20

子进程配置示例:

示例一

[program:test] directory=/opt/bin command=/opt/bin/testautostart=true autorestart=truestderr_logfile=/tmp/test_stderr.log stdout_logfile=/tmp/test_stdout.log user = root

示例2:

[program:laravel-worker]process_name=%(program_name)s_%(process_num)02dcommand=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3autostart=trueautorestart=trueuser=rootnumprocs=8redirect_stderr=truestdout_logfile=/home/forge/app.com/worker.log

注意

1、numprocs大于1表示开启多个子进程,此时应设置 process_name=%(program_name)s_%(process_num)02d
2、应用程序应该是前台程序,不要再后面加 & 符。

常用命令

//查看所有进程的状态	supervisorctl status        		laravel-worker:laravel-worker_00   RUNNING   pid 19299, uptime 0:00:10		laravel-worker:laravel-worker_01   RUNNING   pid 19306, uptime 0:00:04		//停止进程,进程名;用stop停止掉的进程,用reload或者update都不会自动重启。	supervisorctl stop laravel-worker:laravel-worker_00		laravel-worker:laravel-worker_00: stopped			//启动进程,进程名	supervisorctl start laravel-worker:laravel-worker_00		laravel-worker:laravel-worker_00: started			//重启进程,进程名;脚本程序发生改动,可使用这种方式重新加载启动	supervisorctl restart laravel-worker:laravel-worker_00		laravel-worker:laravel-worker_00: stopped		laravel-worker:laravel-worker_00: started			// 新增配置文件后使用该命令,只启动该配置管理的进程组。	// 修改配置文件后使用该命令,kill掉该进程组,重新启动该进程组。	// 删除配置文件后使用该命令,kill掉该进程组。	supervisorctl update		//重新启动配置中的所有进程组,会重启supervisord服务。	supervisorctl reload	注意:	1、把进程名换成all可以管理配置中的所有进程。也可以直接输入supervisorctl进入supervisorctl的shell交互界面,此时上面	的命令不带supervisorctl可直接使用。		2、start、restart、stop都不会载入最新的配置文件。因为他们是对子进程的操作,而不是对主进程的操作。		3、不建议使用 supervisorctl 命令关闭某个进程,因为这样是暴力的,会造成数据异常,建议在程序内部暴露自动退出的方式,使	其执行完自动退出。比如,管理队列进程。		1、如果是修改应用程序,php artisan DemoCommand --action=stop		2、如果是修改配置文件进程数后,我们不能使用supervisor的命令,因为那样会造成现有进程的暴力重启,先kill掉supervisor		进程,这样现有程序就独立了,再使现有进程自动退出 php artisan DemoCommand --action=stop,最后启动supervisord		4、使用supervisor进程管理命令之前先启动supervisord,否则程序报错。		使用命令supervisord -c /etc/supervisord.conf启动。		若是centos7:		systemctl start supervisord.service		systemctl enable supervisord.service

常见问题

1、unix:///var/run/supervisor/supervisor.sock no such file问题描述:安装好supervisor没有开启服务直接使用supervisorctl报的错解决办法:supervisord -c /etc/supervisord.conf2、command中指定的进程已经起来,但supervisor还不断重启问题描述:command中启动方式为后台启动,导致识别不到pid,然后不断重启,这里使用的是elasticsearch,command指定的是$path/bin/elasticsearch -d解决办法:supervisor无法检测后台启动进程的pid,而supervisor本身就是后台启动守护进程,因此不用担心这个3、启动了多个supervisord服务,导致无法正常关闭服务问题描述:在运行supervisord -c /etc/supervisord.conf之前,直接运行过supervisord -c /etc/supervisord.d/xx.conf导致有些进程被多个superviord管理,无法正常关闭进程。解决办法:使用ps -fe | grep supervisord查看所有启动过的supervisord服务,kill相关的进程。

转载地址:http://egxui.baihongyu.com/

你可能感兴趣的文章
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming 排序函数sorted的可选参数
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
visca接口转RS-232C接口线序
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
RGB 立方体
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
关于共享单车定位不准问题
查看>>
终于搞定CString和string之间转换的问题了
查看>>
用防火墙自动拦截攻击IP
查看>>
补充自动屏蔽攻击ip
查看>>
通信和通讯有什么区别?
查看>>
谷歌走了
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>
浅析:setsockopt()改善程序的健壮性
查看>>