【问题标题】:Laravel Forge: How to stop queue workers?Laravel Forge:如何停止队列工作者?
【发布时间】:2018-11-12 03:02:55
【问题描述】:

我已在 Forge 上将队列工作者配置为守护程序,然后使用推荐的部署脚本命令 (php artisan queue:restart)。

如何手动停止和重新启动队列工作程序?如果我停止它,主管将重新启动它。我需要先杀死 Forge 中的活跃工人吗?

这可能是临时需要的。例如,如果我想清除队列已打开的日志文件。

【问题讨论】:

  • supervisorctl stop <name of task>?

标签: laravel laravel-forge


【解决方案1】:

我在部署讨论中直言不讳,我总是告诉人们使用 supervisorctl 命令停止他们的工作进程。

supervisorctl stop <name of task>

使用queue:restart 命令实际上不会重新启动任何东西。它在缓存中设置一个条目,工作进程检查并关闭该条目。正如您所注意到的,主管将重新启动该过程。

这意味着queue:restart 有一个大问题,忽略了命名和它不会重新启动的事实;它将导致使用相同缓存的所有服务器上的所有工作进程重新启动。我认为这是错误的,我认为部署应该只影响当前部署到的当前服务器。

如果您使用的是每个服务器的缓存,例如file 缓存驱动程序,那么这还有另一个问题;如果您的部署完全删除了网站文件夹会发生什么?缓存会改变,队列会重新开始,工作进程可能会混合新旧代码。有趣的调试...

Supervisor 会在进程关闭时发出信号,并等待它干净地关闭,如果没有,则强行杀死它。这些超时可以在主管配置文件中配置。这意味着使用 supervisorctl 停止队列进程不会“中途”终止任何作业,它们将全部完成(假设它们运行足够短的时间,或者您增加超时)。

【讨论】:

  • 哇,我以前从来没有考虑过queue:restart 有多个服务器的事情。好点。
  • 如何在 supervisorctl 中找到任务的名称?
  • @DimitriosDesyllas 您在配置文件中指定任务名称。在文档中,[program:laravel-worker] 将创建名称 laravel-worker,稍后在调用 supervisorctl 时使用该名称。 laravel.com/docs/6.x/queues#supervisor-configuration
  • 我认为您可以向个别工作人员发送SIGSTOP,他们会抓住它并以与queue:restart 相同的方式处理它。如果您可以识别要重新启动的工作人员的进程,请在他们完成当前工作处理后向他们发送干净重新启动的信号。在某些情况下这可能不起作用,但可以尝试。
  • @Jason 您可能正在考虑 SIGTERM。它仍然存在一些 queue:restart; 的问题。它只是关闭并期望进程管理器重新启动它。您需要使用流程管理器的命令来确保它在部署期间停止,并且在部署完成之前不会再次启动。
猜你喜欢
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2015-04-30
相关资源
最近更新 更多