CentOS Supervisord守护进程实现Laravel异步队列任务

2021-06-23 09:58:30 浏览数 (1)

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

代码语言:javascript复制
[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 进程

代码语言:javascript复制
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}

代码语言:javascript复制
kill -s SIGTERM 1319
kill -s SIGTERM 29834

启动队列任务

代码语言:javascript复制
supervisorctl reread
supervisorctl update
supervisorctl start sendMail:*

0 人点赞