Laravel 5通过AWS EC2上的cron进行计划 - 命令未运行

时间:2017-04-11 22:26:46

标签: php laravel laravel-5 cron laravel-scheduler

问题:
我有一个Laravel 5.4工匠任务,我需要通过cron运行 - 但尽管命令和调度程序(显然)设置正确,但它仍未完成。

这是Laravel,php,apache,linux还是crontab问题?什么是最好的诊断方法?

背景
在默认(亚马逊AMI)EC2实例上,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@email.com');

    $schedule   ->command('mycommand:option2')
                        ->dailyAt('07:15')
                        ->emailOutputTo('email@email.com');
}

通过apachesudo crontab -u apache -e添加了以下cron命令:

* * * * * 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
  • 确定运行Laravel 5.4.16
  • 根据php -v
  • 确定运行PHP 7.1.3

2 个答案:

答案 0 :(得分:4)

该问题与php在cron命令定义

中缺少其(绝对)路径有关

cron命令应该是:

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

您可以从终端

which php的输出中获取正确的php路径

注意:
- 通过以下命令添加cron命令,Laravel Scheduler命令可以从apache用户正常工作:

sudo crontab -u apache -e  

- 即使从Log::info('schedule:run');运行cron命令(即通过root设置cron),Laravel仍然没有按照它应该每分钟记录sudo crontab -e ... 这可能与Laravel中的其他一些设置有关 - 因为它甚至没有记录任何内容,即使从项目根目录通过php artisan schedule:run手动运行Scheduler

答案 1 :(得分:0)

通常,经验法则是检查日志文件的写权限,以确保apache用户可写该文件。

如果其他所有方法均失败,则可以在crontab中明确指向您的日志文件:

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

如果您的工作需要访问诸如DB之类的资源,那么您可能需要在调用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

祝你好运。