centos/ubuntu/Mac中使用Supervisor监控管理laravel queue队列进程

Song6159 次浏览2个评论2018年02月27日

Supervisor是一个Linux操作系统上的进程监控软件,它会在queue:listenqueue:work命令发生失败后自动重启它们。

一、centos/ubuntu/Mac/pip安装supervisor

# centos安装supervisor
yum install -y supervisor
# Ubuntu安装supervisor
sudo apt-get install supervisor
# Supervisor是由Python写成,可以使用pip安装
sudo pip install supervisor
# Mac安装supervisor
brew install supervisor

二、简单使用supervisor监听laravel队列

假设我们开发好了一个队列,队列是基于reids,文件目录为/var/www/admin,如下为我们的使用代码: 由于不同系统文件路径不同,ubuntu位于/etc/supervisor/conf.d/新建文件,而centos需要在/etc/supervisord.conf中编辑

# ubuntu环境
vim /etc/supervisor/conf.d/test-report.conf
# centos环境
vim /etc/supervisord.conf

使用如下代码来启动与监控一个queue:work进程,其中tries代表最多尝试3次,否则一直执行;sleep代表无队列时休眠时间:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stdout_logfile=/etc/supervisor/logs/admin-report.log

代码解释:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d ; 一个python字符串表达式,用来表示supervisor进程启动的这个的名称
command=php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3 ; 被监控的进程启动命令
autostart=true ; 随着supervisord的启动而启动
autorestart=true ; 自动重启.
user=root   ; supervisord以root运行
numprocs=8  ; 启动几个进程
redirect_stderr=true ; 重定向stderr到stdout
stdout_logfile=/etc/supervisor/logs/worker.log ; 进程的标准输出写入文件中

三、启动Supervisor

当这个配置文件被创建后,你需要更新Supervisor的配置,并用以下命令来启动该进程:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

四、查看Supervisor进程是否有启动

ps -ef | grep artisan

出现如下表示启动成功,由于我们numprocs为8,所以启动8个进程;

root     31139 30647  0 15:04 ?        00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root     31140 30647  0 15:04 ?        00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root     31141 30647  0 15:04 ?        00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root     31142 30647  0 15:04 ?        00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root     31143 30647  0 15:04 ?        00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root     31144 30647  4 15:04 ?        00:00:05 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root     31145 30647  0 15:04 ?        00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3
root     31146 30647  0 15:04 ?        00:00:00 php /var/www/admin/artisan queue:work --daemon --tries=3 --sleep=3

五、常见问题与错误

1、laravel-worker: ERROR (no such group)

代表你的配置文件未找到,请检查文件路径是否正确

2、这里监听的队列应该是同一个队列 在这里是 sqs 。

是的,都是监听同一个队列。

3、开numprocs个监听进程,是否会造成两个任务并发执行的问题?

多个进程读取同一个队列,也不会读取到一样的数据;可以参考Laravel Redis 多个进程同时取队列问题。当多个worker同时监听的时候,实际上就是生产-消费的关系,在每个进程从队里中pop任务的时候都由Laravel根据不同的驱动提供不同的原子性支持,保证同一个任务不会被多进程同时消费(database驱动使用了事务,redis则使用Lua脚本获取/更新任务以保证原子性)

更多相关好文