laravel 不能 运行 调度命令,而 queue:listen 运行 定期调度()

laravel cannot run scheduled command, while queue:listen run schedule() periodically

注意:我的问题与 which schedule not work 无关。但在我的问题中,调度有效,但它无法调用 artisan 命令。

我使用laravel调度artisan命令。我 运行 像这样 sudo -u www-data /var/www/market/artisan command:printer-serving 281H28 直接从控制台命令。

我知道它有效,因为我在命令的 handle() 函数的入口处 Log::info('Working')

而当我使用 laravel 的日程安排时。而且 cron 运行良好,因为下面 Log::info('command:printer-serving 281H28'); 将内容连续输出到控制台。

但是artisan命令没有执行,它没有向控制台输出任何东西,也没有向数据库写入任何东西

在Kernel.php

<?php namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Log;

class Kernel extends ConsoleKernel {

    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        'App\Console\Commands\Inspire',
        'App\Console\Commands\CommandPrinterServing',
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('inspire')->hourly();
        Log::info('command:printer-serving 281H28');
        $schedule->command('command:printer-serving --force 281H28')->everyMinute();
        //$schedule->command('printer-serving')->everyMinute();
        //$schedule->command(CommandPrinterServing::class, ['281H28'])->everyMinute();
    }

}

命令名称,protected $signature = 'command:printer-serving {pid}';

备注 无论是什么字符串,甚至不是我在 $schedule->command() 函数中输入的命令,都不会发生任何变化,也不会从 cron 日志或 laravel 日志中报告错误。

我想知道如何调试 $schedule->command() 函数。


Cron 文件 vi /etc/cron.minutely/printer-task-minute

#!/bin/sh
cd /var/www/market
sudo -u www-data ./artisan command:regen-htaccess
#sudo -u www-data ./artisan schedule:run >> /dev/null 2>&1
sudo -u www-data ./artisan schedule:run

奇怪的是日志每 3 秒输出 4 次。

> [2017-11-29 16:52:14] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:14] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:14] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:14] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:17] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:17] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:17] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:17] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:21] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:21] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:21] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:21] worker_env.INFO: command:printer-serving 281H28 
> [2017-11-29 16:52:24] worker_env.INFO: command:printer-serving 281H28

我对日志频率感到困惑,所以我停止了 cron 和 beanstalkd。但是日志输出并没有停止。即使我停止了 apache2,日志也会保持输出。然后查看php进程,发现ps aux | grep php命令的输出中有4个queue:listen --queue=xxxx --env=worker_env --delay=3。到这里我找到了为什么日志会以那个频率输出,但是我不知道为什么queue:listen执行schedule()函数就像这个问题Understanding Queues and Scheduler on Laravel 5.2.


每次执行 artisan 命令时 sudo -u www-data /var/www/market/artisan xxxxx 都会调用一次 schedule() 函数。如果命令是 queue:listen,比如 sudo -u www-data /var/www/market/artisan queue:listen xxxxx,那么 schedule() 函数将被定期调用。但是 schedule() 中的命令不会 运行,除了 Log::info()。只有当运行 schedule:run命令时,artisan命令和schedule()中的Log::info()都会执行。

我认为你应该使用下面的命令

$schedule->command('printer_serving')->everyMinute()‌​;

google 问题、阅读 laravel 文档和 运行 多次测试花了我一天的时间。终于搞定了。

Laravel的artisan queue:listen命令定期调用Kernel.php中的schedule(),而它只运行调用Log::info() schedule()不是$schedule->command()(这里我也是一头雾水).

我有四个队列 运行ning,队列 1 sudo -u www-data php artisan queue:work --queue=queue1 --env=worker_env --delay=3 --timeout=600。与queue2,3,4相同。所以schedule()中的Log::info()将每3秒执行四次。

以上让我觉得日程安排得很好。实际上,调度没有被执行。我发现 /etc/cron.minutely/printer-task-minute 没有 x 权限,所以我为它添加 x 权限。而且我发现我没有配置crontab文件,所以我将* * * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.minutely )添加到/etc/crontab(我不熟悉cron)。

解法:
像上面那样配置cron,或者参考手册。
queue:listen改成queue:work(改成queue:work后,schedule()不会被队列周期性执行,我也不知道这里是什么原因。).