2015-06-08 3 views
13

Я создал следующую Laravel команды:Laravel «Никакие запланированные команды не готовы к запуску».

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

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

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

Мой хрон работает успешно каждую ночь, но журналы просто сказать: «Нет запланированных команд не готовы к запуску»

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

Спасибо!

ответ

4

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

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

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

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

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

Изменить запись кронтаб для

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

+0

Да, я попытался запустить обе команды вручную, и они работают нормально. Они уже добавлены в массив '$ commands'. Все функциональные возможности работают как ожидалось - единственная проблема заключается в том, что cron не запускает их для запуска, просто отображая сообщение, указанное в моем вопросе. Спасибо –

+0

Измените запись crontab на '* * * * * php/home/privates/public_html/staging/current/artisan schedule: run'. – chanafdo

+3

Я изменил его, чтобы работать каждую минуту, и, похоже, он работает. Кажется глупо неэффективным, чтобы каждый раз запускать его, чтобы что-то делать один раз в день, но это проблема еще на один день. Благодарю. –

0

Я думаю, что мой блог поможет вам ответить на ваш вопрос. См. Ниже или ссылку: 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), 
       ); 
     } 

} 

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

Artisan::add(new FirstCommand); 

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

$ php artisan user:active 

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

Наконец, поместите команду в кронтаб:

crontab -e 

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

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

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

+0

Спасибо за информацию. Очень ценится :) –

4

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

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

<?php 
... 

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

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

+0

Есть ли способ сделать так, чтобы он не вышел, прежде чем все запланированные задачи будут выполнены? Или есть способ проверить записи, сделанные в Kernel.php, успешно запустится, прежде чем развертывать его на производстве? – sabertooth1990

+0

@ sabertooth1990 У меня не возникла первая часть вопроса: заставить ее выйти. Но для тестирования я всегда стараюсь клонировать свою производственную среду как можно больше локально - или, если это невозможно, в промежуточной среде - поэтому у меня также есть cron, выполняющий расписания локально. –

+0

Когда я запускаю 'php artisan your: command' с консоли, он работает. но когда я положил что-то вроде графиком защищенных функций (Schedule $ schedule) { $ schedule-> command ('my: command') -> dailyAt ('13: 40 ') -> withoutOverlapping(); } он не получает запланированных и выполненных даже если я жду целый день. – sabertooth1990

3

The Laravel запланированных команд основаны в часовом поясе, который вы настроили в вашем приложении/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 TIMEZONE СОГЛАСОВАННОГО (в данном случае Америка/Богота)

то же самое относится, если вы specif y время для выполнения задачи:

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

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

+2

На вашем последнем фрагменте кода я считаю, что он не привязан, а представляет собой единственный метод dailyAt() – Watercayman

5

я понял, что проблема формирования меня была

->withoutOverlapping() 

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

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

+0

[Этот ответ] (https://stackoverflow.com/a/39804140/1128918) дает представление о том, почему 'withoutOverlapping' не может работать в вашем случае. У меня была аналогичная проблема, но я хотел сохранить наложенную проверку на месте. В моем случае возникла проблема с перезагрузкой экземпляра. –

+0

Еще одна мысль: у меня не было файла расписания в каталоге 'storage/framework'. Тем не менее, запуск 'php artisan cache: clear' сделал трюк. –

3

При запуске

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 
0

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

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

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

Лучший способ думать об этом является то, что этот код устанавливает с именем команды «чтобы быть работоспособным каждый раз, когда минутная фигура текущего времени 0 или 5». Другими словами, если я запускаю аргумент командной строки: php artisan schedule:run в 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. Единственное, что я могу себе представить, это то, что есть некоторая несогласованность с вашими часовыми поясами, как это предлагает @Octavio Herrera. Но это трудно сказать, не зная немного больше о вашей среде.

Смежные вопросы