5

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

这是 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');
}

apache为via添加了以下 cron 命令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
4

2 回答 2

7

该问题与phpcron 命令定义中缺少其(绝对)路径有关

cron 命令应该是:

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

which php您可以从终端的输出中获取正确的 php 路径

注意:
- Laravel 调度程序命令可以apache通过以下方式添加 cron 命令,用户可以正常工作:

sudo crontab -u apache -e  

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

于 2017-04-11T22:56:36.500 回答
1

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

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

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

如果您的作业需要访问数据库等资源,那么您可能需要在调用 artisan.xml 之前获取环境变量定义文件。像这样:

* * * * * 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

祝你好运。

于 2018-08-22T05:32:30.937 回答