laravel не может выполнить запланированную команду, а очередь: периодически выполнять расписание выполнения ()

Примечание. Мой вопрос не имеет ничего общего с графиком команд в Laravel, график которого не работает. Но в моем вопросе работает планирование, но он не может вызвать команду artisan.

Я использую команду larvel scheduling artisan. Я запускаю команду непосредственно с консоли, например, эту команду sudo -u www-data /var/www/market/artisan command:printer-serving 281H28 .

Я знаю, что это работает, потому что у меня есть Log::info('Working') при вводе функции handle() команды.

Пока я использую планирование 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 секунды.

 > [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 и обнаруживаю, что есть четыре queue:listen --queue=xxxx --env=worker_env --delay=3 в выводе команды ps aux | grep php ps aux | grep php . Здесь я нашел, почему вывод журнала на этой частоте, но я не знаю, почему queue:listen выполняет функцию schedule() как этот вопрос. Понимание очередей и планировщика на 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() . Только при выполнении команды run schedule:run как команда artisan, так и Log::info() в schedule() .

Я думаю, вы должны использовать команду ниже

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

Это стоит мне день, чтобы решить эту проблему, прочитать документы laravel и запустить много тестов. Наконец, я все понял.

Локальная artisan queue:listen Laravel artisan queue:listen команду вызывать schedule() в Kernel.php периодически, в то время как она запускает Log::info() в schedule() не в команде $schedule->command() здесь ( я тоже смущен) ).

У меня четыре очереди, для queue1 sudo -u www-data php artisan queue:work --queue=queue1 --env=worker_env --delay=3 --timeout=600 . То же самое с queue2, 3, 4. Таким образом, Log::info() в schedule() будет выполняться четыре раза каждые 3 секунды.

Выше мне показалось, что график работает хорошо. Фактически, расписание не выполняется. Я обнаружил, что /etc/cron.minutely/printer-task-minute не имеет привилегий x , поэтому я добавляю для них привилегию x . И я обнаружил, что не создал файл crontab, поэтому добавляю * * * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.minutely ) * * * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.minutely ) в /etc/crontab (я не знаком с cron).

Решение:
Конфигурируйте cron, как указано выше, или обратитесь к руководству.
Изменить queue:listen queue:work (при изменении на queue:work , schedule() не будет выполняться по очереди периодически, я также не знаю причины здесь. ).