注意:我的问题与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
。
答案 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
不会定期按队列执行,我也不知道原因。< /强>)。