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()
不会被队列周期性执行,我也不知道这里是什么原因。).
注意:我的问题与
我使用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()
不会被队列周期性执行,我也不知道这里是什么原因。).