Supervisor 是一个 Python 写的进程管理工具,有时一个进程需要在后台运行,并且意外挂掉后能够自动重启,就需要这么一个管理进程的工具。在 Laravel 开发中,也经常使用到队列监听,可以配合 Supervisor 来管理 Laravel 队列进程。
相关网站说明 https://pypi.org/project/supervisor/#modal-close
Supervisor的安装
- yum安装,不过版本过低,暂时不支持python2.7以上所有版本
-
yum install supervisor
- tar.gz安装
-
下载相关内容
https://pypi.org/simple/setuptools/ 下载setuptools-33.1.1.zip https://pypi.org/simple/meld3/ 下载meld3-1.0.2.tar.gzhttps://pypi.org/simple/supervisor/ 下载supervisor-3.3.4.tar.gz
解压安装
##先获取root权限 sudo -s unzip setuptools-33.1.1.zip cd setuptools-33.1.1 python setup.py install tar zxvf meld3-1.0.2.tar.gz cd meld3-1.0.2 python setup.py install tar zxvf supervisor-3.3.4.tar.gz cd supervisor-3.3.4 python setup.py install
开机启动
进入目录 /usr/lib/systemd/system/,增加文件 supervisord.service,来使得机器启动的时候启动supervisor,文件内容:
# supervisord service for systemd (CentOS 7.0+) # by ET-CS (https://github.com/ET-CS) [Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown ExecReload=/usr/bin/supervisorctl $OPTIONS reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
- 设置开机启动
-
激活开机启动命令 systemctl enable supervisord.service 启动supervisor进程 systemctl start supervisord
Supervisor的配置
- 运行这个命令可以生成一个默认的配置文件:
-
echo_supervisord_conf > /etc/supervisord.conf
生成成功后,打开编辑这个文件,把最后的 include 块的注释打开,并修改如下:
[include] files = /etc/supervisor/*.conf
- 新增的 Supervisor 配置文件放在 /etc/supervisor 目录下,并且以 conf 结尾。
-
mkdir /etc/supervisor chmod -R 777 /etc/supervisor vim /etc/supervisor/supervisor.conf
- 配置如下
-
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d # 设置为你项目目录下 command=php /usr/share/nginx/html/tanteng.me/artisan queue:work --tries=3 autostart=true autorestart=true user=root #运行进程的用户 numprocs=8 #运行多少个进程监听 redirect_stderr=true stdout_logfile=/var/log/supervisor/laravel-queue.log #错误日志 stderr_logfile=/var/log/supervisor/laravel-queue-error.log [supervisord]
detail
[program:x] 该配置块包含一个或者多个program段,program来表明supervisord要控制哪些程序。 该配置块的头部是有固定格式的,一个关键字program,后面跟着一个冒号,接下来才是程序名。 例如:[program:foo],foo就是程序名,在使用supervisorctl来操作程序的时候,就是以foo来标明的。 command:启动程序使用的命令,可以是绝对路径或者相对路径 process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name) snumprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1 numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值 priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999 autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。 autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exit codes中定义的时,进程会重启, true:进程会无条件重启当退出的时候。 startsecs:程序启动后等待多长时间后才认为程序启动成功 startretries: supervisord尝试启动一个程序时尝试的次数。默认是3 exitcodes:一个预期的退出返回码,默认是0,2。stopsignal:当收到stop请求的时候, 发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。 stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间 stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组 killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。 user:如果supervisord以root运行,则会使用这个设置用户启动子程序 redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。 stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。 stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份 stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份s tderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GBstderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 environment:一个k/v对的list列表 directory:supervisord在生成子进程的时候会切换到该目录 umask:设置进程的umask serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url
启动Supervisor
supervisord -c /etc/supervisord.conf
如果提示已经有进程在运行,那么先 kill 掉它。 配置完成后启动
supervisorctl reread supervisorctl start laravel-worker:* supervisorctl update 启动最新的这个配置文件的进程,其他进程无影响 supervisorctl reload 重启配置文件中的所有进程 supervisorctl start/stop/restart program_game 开启/停止/重启 配置文件中的程序名 supervisorctl stop all 停掉所有的进程
如果没有报错则表示成功,使用全局启动
systemtcl enable supervisord systemtcl start supervisord