Проблема:
У меня есть кустарное задание 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
Ресурсы проверены:
Другая информация:
php artisan --version
php -v
проблема была связана с 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
из корня проекта
Как правило, практическим правилом будет проверка прав записи в вашем файле журнала, чтобы убедиться, что он доступен для записи 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
Удачи.