为什么Supervisor无法启动程序?

9
我正在使用Redis和supervisor管理多个worker处理laravel队列任务。
我有多个numprocs,它们在某些天工作得非常完美,然后即使supervisor处于活动状态,它也会崩溃

因为在supervisor中,当supervisord失败超过配置文件中设置的startretries值以启动程序/worker时,程序/worker将进入致命状态,然后它将不会处理任何作业,所以当所有worker都进入此状态时,supervisor就会崩溃。 然后我们需要手动重启Supervisor才能再次开始处理。

但这不是一个适当的解决方案。
我的问题是为什么supervisor无法启动,有什么解决方法?
参考Supervisor文档:http://supervisord.org/subprocess.html
我的配置文件如下:

[program:name]
process_name=%(program_name)s_%(process_num)02d
command=php /path/artisan queue:work --queue=queue1,queue2,queue3,queue4,default --tries=1 --daemon
autostart=true
autorestart=true
startretries=15
numprocs=150
user=root
redirect_stderr=true
stdout_logfile=/path/worker.log
stderr_logfile=/path/workerError.log

更新
我的日志文件看起来像这样 enter image description here

我的标准输出日志文件看起来像这样

enter image description here 任何帮助将不胜感激。


你能展示给你的主管日志文件吗? - Pavel
嗨@Pavel,我已经更新了我的问题并附上了日志文件数据。请看一下。 - Bibhudatta Sahoo
我们不能仅仅增加startretries的值,我们需要找出为什么无法启动工作进程。 - Bibhudatta Sahoo
你需要添加由PHP进程创建的日志。当前的日志仅显示工作进程106产生了严重问题并已关闭。 有趣的日志应该在worker.logworkerError.log中。 可能是从MySQL中的“连接过多”到完全不同的东西。您还可以查看/var/log/daemon.log,因为它将包含由工作进程运行的PHP进程内部的致命错误。 - cb0
@Jamesking56,它将处理队列中存在的作业。 - Bibhudatta Sahoo
显示剩余6条评论
2个回答

1

相关的日志条目如下:

 exited: laravelw_106 (exit status 0; not expected)
gave up: laravelw_106 entered FATAL state, ntoo many start retries too quickly

在启动后,Laravel队列工作程序因某种原因立即停止。 队列工作程序应该是长时间运行的。

您需要找出它为什么退出; 可能您的作业中有exit()die()语句。


谢谢回复,但是在我的工作中没有任何die()exit(),任务完成后只有return()返回结果。 - Bibhudatta Sahoo

1
您的消费者/工作人员在启动后很快就会死亡。消费者应该是一个正在运行无限循环等待任务/消息的进程。您说在任务完成后有一个return(),也许这会停止工作人员。
尝试手动运行工作人员,然后在队列上生成消息。工人不应该在完成一个任务后停止。

嗨@bogdancep,当我手动运行工作程序时,它可以完美地运行,但是从我的用户定义函数中仅返回结果到作业处理程序,但我没有从作业处理程序方法中返回任何内容。因此,在我的代码中完成一个任务后,我没有停止工作程序。 - Bibhudatta Sahoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接