Laravel "Никакие запланированные команды не готовы к запуску".

Я установил следующие команды Laravel:

protected function schedule(Schedule $schedule) {
        $schedule->command('command:daily-reset')->daily();
        $schedule->command('command:monthly-reset')->monthly();
}

Затем на моем сервере я установил задание cron для запуска один раз в день (в 00:00).

0 0 * * * php /home/privates/public_html/staging/current/artisan schedule:run

Мое задание cron работает успешно каждую ночь, но журналы просто говорят: "Никакие запланированные команды не готовы к запуску".

Что я делаю неправильно? Я ожидал, что моя команда daily будет запускаться каждую ночь.

Спасибо!

Ответ 1

Вы пытались запустить команду manuallay?

Запустите php artisan и проверьте, зарегистрированы ли ваши команды.

Если вы зарегистрировали свои команды, вы должны увидеть command:daily-reset и command:monthly-reset в списке доступных команд мастеров.

Если вы их не видите, продолжайте и зарегистрируйте свои команды, добавив его в свойство commands, доступное в app/Console/Kernel.php.

protected $commands = [
    'App\Console\Commands\YourFirstCommand',
    'App\Console\Commands\YourSecondCommand'
];

Измените запись crontab на

* * * * * php /home/privates/public_html/staging/current/artisan schedule:run

Ответ 2

При запуске

php artisan schedule:run

на сервере, где хранится ваш проект, вы можете увидеть все ваши команды, запущенные с выходом, выглядящими так:

"Running scheduled command: '/usr/local/bin/php' 'artisan' cache:update > '/dev/null' 2>&1 &"

но только если текущее время является точным, для которого запланирована команда. В противном случае вы увидите этот вывод:

"No scheduled commands are ready to run."

Например, если вы планируете команду каждые пять минут и запустите команду в 09:07 часов, вы увидите, что нет запланированных команд, но если вы запустите ее в 09:10, вы увидите свою команду Бег.

Таким образом, вы можете просто планировать свою команду для запуска каждые 5 минут только для целей отладки:

$schedule->command('command:daily-reset')->everyFiveMinutes();

затем наблюдайте, есть ли какая-либо ошибка во время работы и в конечном итоге ее исправить. По мне проблема заключалась в том, что я не установил GuzzleHttp (позор), поэтому исправление просто запускало это в терминале:

composer require guzzlehttp/guzzle

Ответ 3

Я понял, что проблема для меня заключалась в следующем методе:

->withoutOverlapping() 

Как только я удалил этот метод, мои команды начали выполняться и находились в процессе демона.

Я думаю, что в этом методе может быть ошибка, но мой проект на данный момент может немного перекрываться, так что это круто.

Ответ 4

NB: Это не ответ на этот вопрос, а подсказка для тех, кто отлаживает с помощью php artisan schedule:run вручную. Надеюсь, что это избавит кого-то несколько минут от головной боли.

Убедитесь, что запланированное задание можно запустить немедленно. Вы можете использовать для этого метод exec.

<?php
...

protected function schedule (Schedule $schedule) {
    $schedule -> exec("php artisan your:command");
}

Причиной этого является то, что вы можете планировать запуск задачи в определенное время, и если это время еще не наступит, оно выведет: "Никакие запланированные команды не готовы к запуску".

Ответ 5

Плановые запланированные команды Laravel основаны на часовом поясе, который вы настроили в файле app/config/app.php(laravel 5.1):

/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/

'timezone' => 'America/Bogota',

Итак, если вы создадите команду и зарегистрируете ее для запуска в качестве запланированной задачи с помощью:

$schedule->command('command:daily-reset')->daily();

он будет запускаться каждый день в 00:00 УКАЗАННОГО ВРЕМЕНИ (в данном случае Америка/Богота)

То же самое применяется, если указать время для запуска задачи:

$schedule->command('command:daily-reset')->daily()->at('02:30');

Это будет работать в 02:30 утра по местному времени в Америке/Боготе.

Ответ 6

Полный ответ на этот вопрос не указан выше, насколько я могу судить. Предположим, что наше расписание выглядит следующим образом:

protected function schedule(Schedule $schedule)
{
    $schedule
        -> command('cbh:dummyCommand')
        -> everyFiveMinutes()
        -> appendOutputTo ('/my/logs/laravel_output.log');
}

Я обнаружил, что этот код не запускает вашу работу каждые 5 минут. Это также предотвращает повторную команду, если она была запущена менее 5 минут назад.

Лучший способ подумать о том, что этот код устанавливает именованную команду "быть запущенной каждый раз, когда минутное значение текущего времени равно 0 или 5". Другими словами, если я запустил аргумент командной строки: php artisan schedule:run at 11:04, тогда ответ будет выглядеть следующим образом:

# No scheduled commands are ready to run.

Но если я запустил ту же команду в 11:00 или 11:05, мы получим:

# Running scheduled command: php artisan cbh:dummyCommand >> /my/logs/laravel_output.log 2>&1

И я получаю вывод в своем лог файле.

Я обнаружил выше, когда мой расписание everyFiveMinutes() создавал журнал в моем файле каждые 10 минут на основании того факта, что мой планировщик задач выполнялся каждые 2 минуты.

Однако это не совсем относится к вашей проблеме, учитывая, что расписание daily() (0 0 * * *) совпадает с вашим расписанием cron-job. Единственное, что я могу себе представить, это то, что есть некоторая несогласованность с вашими часовыми поясами, как это предлагает @Octavio Herrera. Но это трудно сказать, не зная немного больше о вашей среде.

Ответ 7

Я думаю, что мой блог поможет вам ответить на ваш вопрос. См. Ниже или ссылку: Laravel Crontab Во многих проектах вам нужно использовать crontab (задания cron) для выполнения некоторых задач по отправке электронной почты или удалению записей об ошибках в БД. С Laravel Project вы можете сделать это проще.

Будьте достаточно сильными, чтобы уйти и достаточно терпеливы, чтобы дождаться того, чего заслуживаете Будьте достаточно сильными, чтобы отпустить и достаточно терпеливы, чтобы дождаться того, чего вы заслуживаете.

Создайте команду в Laravel 4:

<?php

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class FirstCommand extends Command {

        /**
         * The console command name.
         *
         * @var string
         */
        protected $name = 'user:active';

        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Command description.';

        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
                parent::__construct();
        }

        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function fire()
        {
                echo "User Actived";
        }
        /**
         * Get the console command arguments.
         *
         * @return array
         */
        protected function getArguments()
        {
                return array(
                );
        }

        /**
         * Get the console command options.
         *
         * @return array
         */
        protected function getOptions()
        {
                return array(
                        array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
                );
        }

}

В следующем шаге вам нужно зарегистрировать команду с помощью CLAR Laravel. Так легко, вы открываете файл app/start/artisan.php и добавляете одну строку, как показано ниже:

Artisan::add(new FirstCommand);

Вы закончили создание команды Laravel. Чтобы проверить, вы можете использовать следующую команду:

$ php artisan user:active

Пользователь активен Вышеприведенный результат означает, что вы успешно зарегистрируете команду.

Наконец, введите команду в crontab:

crontab -e

Добавить строку (запустить команду каждые 2 минуты):

*/2 * * * * php path_to_laravel_project/artisan user:active

Вот и все. Спасибо, что поговорили, чтобы прочитать это.

Ответ 8

В Windows я устранил эту проблему, настроив запуск запланированной задачи каждую минуту (хотя я хотел запускать команду только один раз в день), в противном случае я всегда получал сообщение No scheduled commands are ready to run..

Ответ 9

У меня такая же проблема. Каждая команда была правильно зарегистрирована, но я всегда получал сообщение "Запланированные команды не готовы к выполнению".. Проблема заключалась в том, что веб-сайт находился в "режиме обслуживания" (команда php artisan down), пока мы выполняли обновления и тесты.