Расписание Laravel 5 через cron на AWS EC2 — команды не выполняются

Проблема:
У меня есть кустарное задание Laravel 5.4, которое мне нужно запустить через cron, но оно не выполняется, несмотря на то, что команда и планировщик (очевидно) настроены правильно.

Это проблема Laravel, php, apache, linux или crontab? Какой лучший способ диагностики?


Фон
На экземпляре EC2 по умолчанию (amazon AMI) команда artisan определена правильно и отлично выполняется из каталога проекта (который /var/www/html/myproject/) при вызове через:

php artisan mycommand:option1

Я добавил это в график в app/Console/Kernel.php который выглядит так:

protected function schedule(Schedule $schedule)
{
Log::info('schedule:run');
$schedule   ->command('mycommand:option1')
->dailyAt('07:00')
->emailOutputTo('[email protected]');

$schedule   ->command('mycommand:option2')
->dailyAt('07:15')
->emailOutputTo('[email protected]');
}

Добавлена ​​следующая команда cron для apache с помощью sudo crontab -u apache -e:

* * * * * php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1

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

  • ec2-user с помощью crontab -e
  • root с помощью sudo crontab -e

Выход системы

от sudo tail -f /var/log/cron :

Apr 11 19:17:01 ip-10-0-0-42 CROND[17968]: (root) CMD (php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1)
Apr 11 19:17:01 ip-10-0-0-42 CROND[17969]: (ec2-user) CMD (php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1)
Apr 11 19:17:01 ip-10-0-0-42 CROND[17970]: (apache) CMD (php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1)
Apr 11 19:18:01 ip-10-0-0-42 CROND[17980]: (ec2-user) CMD (php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1)
Apr 11 19:18:01 ip-10-0-0-42 CROND[17981]: (apache) CMD (php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1)
Apr 11 19:18:01 ip-10-0-0-42 CROND[17982]: (root) CMD (php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1)
Apr 11 19:19:01 ip-10-0-0-42 CROND[17992]: (root) CMD (php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1)
Apr 11 19:19:01 ip-10-0-0-42 CROND[17993]: (ec2-user) CMD (php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1)
Apr 11 19:19:01 ip-10-0-0-42 CROND[17994]: (apache) CMD (php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1)

ничего не появляется ни в одном из них:
sudo tail -f /var/www/html/myproject/storage/log/laravel.log
или же
sudo tail -f /var/www/html/myproject/storage/log/laravel-2017-04-11.log


Дополнительная информация

Разрешения ядра:

drwxr-sr-x 2 apache apache 4096 Feb 24 00:24 Commands
-rw-r--r-- 1 apache apache 1111 Feb 24 00:24 Kernel.php

Ресурсы проверены:


Другая информация:

  • запуск Laravel 5.4.16, как определено php artisan --version
  • работает PHP 7.1.3, как определено php -v

3

Решение

проблема была связана с php отсутствует (абсолютный) путь в определении команды cron

команда cron должна была быть:

* * * * * /usr/local/bin/php /var/www/html/myproject/artisan schedule:run >> /dev/null 2>&1

Вы можете получить правильный путь PHP из вывода which php в терминале

Заметки:
— Команды Laravel Scheduler работают нормально с apache пользователь, добавив команды cron через:

sudo crontab -u apache -e

— Ларавел еще не заглядывает Log::info('schedule:run'); каждую минуту, как следует … даже при запуске команд cron из root (т.е. установка cron через sudo crontab -e)
Это, вероятно, связано с некоторыми другими настройками в Laravel — поскольку он ничего не регистрирует, даже когда планировщик запускается вручную через php artisan schedule:run из корня проекта

4

Другие решения

Как правило, практическим правилом будет проверка прав записи в вашем файле журнала, чтобы убедиться, что он доступен для записи apache пользователь.

Если ничего не помогает, вы можете явно указать свой файл журнала в crontab:

* * * * * /usr/local/bin/php /var/www/html/myproject/artisan schedule:run >> /var/www/html/myproject/storage/logs/laravel.log 2>&1

Если вашим заданиям необходим доступ к таким ресурсам, как БД, вам может потребоваться найти файл определения переменных среды перед вызовом artisan. Примерно так:

* * * * * source /path/to/envvars; /usr/local/bin/php /var/www/html/myproject/artisan schedule:run >> /var/www/html/myproject/storage/logs/laravel.log 2>&1

Удачи.

0

По вопросам рекламы [email protected]