laravel无法运行预定命令,而队列:定期监听运行schedule()

时间:2017-11-29 08:31:04

标签: php laravel command scheduled-tasks artisan

注意:我的问题与Command schedule in Laravel没有任何关系。但在我的问题中,调度工作正常,但它无法调用工匠命令。

我使用laravel scheduling artisan命令。我直接从控制台运行命令,如sudo -u www-data /var/www/market/artisan command:printer-serving 281H28

我知道它有效,因为我在Log::info('Working')命令的handle()函数的输入处Log::info('command:printer-serving 281H28');

当我使用laravel的调度时。并且cron运行良好,低于<?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(); } } 将内容连续输出到控制台。

但是artisan命令没有执行,它没有输出到控制台,也没有写入数据库

在Kernel.php中

protected $signature = 'command:printer-serving {pid}';

命令名称$schedule->command()

注意 无论什么字符串,即使不是我放入$schedule->command()函数的命令,也不会发生任何变化,也不会报告来自cron日志或laravel日志的错误。

我想知道如何调试vi /etc/cron.minutely/printer-task-minute函数。

Cron文件#!/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

> [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

所需的东西是每3秒四个日志输出。

queue:listen --queue=xxxx --env=worker_env --delay=3

我对日志频率感到困惑,所以我停止了cron和beanstalkd。但是日志输出不会停止。即使我停止apache2,日志保持输出。然后我检查php进程,发现命令ps aux | grep php的输出中有四个queue:listen。在这里,我找到了该频率中日志输出的原因,但我不知道为什么schedule()执行sudo -u www-data /var/www/market/artisan xxxxx函数作为此问题Understanding Queues and Scheduler on Laravel 5.2

每次执行工匠命令schedule()时,queue:listen函数都会被调用一次。如果命令为sudo -u www-data /var/www/market/artisan queue:listen xxxxx,如schedule(),则会定期调用schedule()函数。但Log::info()中的命令将无法运行,schedule:run除外。仅在运行Log::info()命令时,才会执行artisan命令和schedule()中的SELECT CASE WHEN ( ( [MKP_LastHearTestFletcherIndexLeft] < 30 ) OR ( [MKP_LastHearTestFletcherIndexRight] < 30 ) ) THEN 'PC_Less_30dB' END AS PC_Less_30dB, CASE WHEN ( ( [MKP_LastHearTestFletcherIndexLeft] > 30 ) OR ( [MKP_LastHearTestFletcherIndexRight] > 30 ) ) THEN 'PC_More_30dB' END AS PC_More_30dB FROM RPT.ANIDIM_MarketingPerson WHERE ( [MKP_LastSalesHEADate] IS NULL ) AND MKP_Number = 5830656 SELECT CASE WHEN ( Mkp_Lastsalesheadaysago < 1278 ) THEN 'CL_Less_3_5_Years' END AS CL_Less_3_5_Years, CASE WHEN ( Mkp_Lastsalesheadaysago > 1277 ) THEN 'CL_More_3_5_Years' END AS CL_More_3_5_Years FROM RPT.ANIDIM_MarketingPerson WHERE ( [MKP_LastSalesHEADate] IS NOT NULL ) AND MKP_Number = 2098914

2 个答案:

答案 0 :(得分:1)

我认为你应该使用以下命令

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

答案 1 :(得分:0)

我花了一天的时间去研究这个问题,阅读laravel文档,并进行多次测试。最后我说出来了。

Laravel的artisan queue:listen命令定期调用Kernel.php中的schedule(),而只运行Log::info()中的schedule()而不是{{1} (这里我也很困惑)。

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

上面让我觉得时间表运作良好。实际上,时间表没有执行。我发现schedule()没有/etc/cron.minutely/printer-task-minute权限,因此我为其添加了x权限。我发现我没有配置crontab文件,因此我将x添加到* * * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.minutely )(我不熟悉cron)。

<强>解决方案:
像上面那样配置cron,或参考手册 将/etc/crontab更改为queue:listen(当更改为queue:work时,queue:work不会定期按队列执行,我也不知道原因。< /强>)。