Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动重启。
这里我以PHP框架Laravel为例,它提供了对队列的支持,要让队列监听常驻内存,就需要借助Supervisord守护进程工具,同时,解决使用了Supervisor后,Laravel队列被重复执行的问题(自己的配置问题)。
安装 Supervisor
代码语言:javascript复制yum install -y supervisor
目录结构:
代码语言:javascript复制/etc
supervisord.d/ #我们自定义的项目进程配置目录
supervisord.conf #supervisor服务的一些配置
队列任务配置
在 /etc/supervisord.d/
目录中新增 laravel-worker.ini
[program:sendMail]
process_name=%(program_name)s_%(process_num)02d
command=/usr/local/php/bin/php /var/www/LaravelProject/artisan queue:work --queue=send_mail --sleep=3
autostart=true
autorestart=true
user=root
#numprocs=8
redirect_stderr=true
配置中,我注释掉了 numprocs=8
,这是之前踩的一个坑,设置进程数为8,最后我的一个队列被重复执行多次,但在 job
表中只生成了一条记录,很显然就是 supervisor
配置问题导致,先把这里注释了。
启动 Supervisord
代码语言:javascript复制supervisord -c /etc/supervisord.conf
如果报错了,并且执行 systemctl status supervisord
状态为 failed
,表示失败了,先杀死在执行的进程
查看 supervisord
进程
ps -ef | grep supervisord
代码语言:javascript复制[root@izwz99d7x8qidiasecenewz ~]# ps -ef | grep supervisord
root 1319 1 0 Jan20 ? 00:00:28 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 29834 29053 0 19:41 pts/0 00:00:00 grep --color=auto supervisord
然后执行 kill -s SIGTERM {pid}
kill -s SIGTERM 1319
kill -s SIGTERM 29834
启动队列任务
代码语言:javascript复制supervisorctl reread
supervisorctl update
supervisorctl start sendMail:*