【问题标题】:Keep laravel queue:work running while in jailshell保持 laravel 队列:工作在越狱时运行
【发布时间】:2017-09-23 18:59:39
【问题描述】:

我在保持 queue:work 命令在我的服务器上运行时遇到问题。我尝试了 nohup,但是一旦我关闭终端(无论我尝试了什么,它每 5 分钟左右超时一次),该过程就会消失。

我想过在 cron 中运行一个脚本来启动 nohup 命令,但是它也在 jailshell 中运行,所以我无法查看该进程是否仍在从以前​​的 cron 运行,我不想要潜在的 20k 副本,因为它试图每分钟启动一次。

我也无权安装软件来安装 Supervisord。

那么,我可以使用哪些其他解决方案来确保它继续运行?

编辑我联系了我的主机的支持人员,而且看起来我没有真正的替代方案。我想我将不得不在 Linode 上设置这个项目,或者重做一些事情以不进行排队任务。

【问题讨论】:

  • 这些天我不会为 Laravel 应用程序使用共享主机,而不是当你可以以类似的价格在 Digital Ocean 或 Linode 上获得 VPS 时。
  • 我有一个转销商金额,因此在我的帐户上托管另一个网站不会产生额外费用。但是,是的,Laravel 足够复杂,可能值得专门做一些事情。
  • 您可以切换到同步驱动程序,但这违背了首先要有队列的目的。
  • 是的。我使用队列的主要目的是因为我正在向 pushover 发送消息,您需要限制发送它们的频率,所以这是我能想到的最佳方式。加上队列的其他好处。由于我正在使用它们,我已经排队了一些东西,所以如果我关闭排队,那么我必须改变一些东西。
  • 我能想到的唯一其他解决方案是将队列工作程序移动到第三方服务 - 例如,使用 Amazon SQS 作为队列并让工作程序在 EC2 实例上运行,但这涉及无论如何都要为第三方服务付费,所以你最好还是坚持使用 VPS。

标签: laravel cron jail-shell


【解决方案1】:

似乎问题出在 shell 配置上,因为命令 ps 被重写为仅显示子进程。

解决方案是要求您的托管服务提供商(或在允许的情况下自行更改)设置此变量:

SHELL="/bin/bash"

这个简单的修复让我的功能正常工作。

现在我的Kernel.php 如下所示:

$command = "ps faux | grep queue:work";

exec($command, $task_list);
// Process are duplicate in ps and show also the command as two single lines
$running_process = (count($task_list) / 2) - 1;

if($running_process < 1)
    $schedule->command('queue:work --queue=high,low --tries=3')
        ->everyMinute();
else if($running_process > 5)
    // If too many are active, restart everything to avoid overload
    $schedule->call(function(){
        Artisan::call('queue:restart');
    })->everyMinute();

此代码确保至少有一个工作人员始终在运行,同时如果您有超过 5 个工作人员处于活动状态,则强制restart

【讨论】:

    猜你喜欢
    • 2018-10-20
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多