Laravel 5 通过 AWS EC2 上的 cron 计划 - 命令不是 运行
Laravel 5 schedule via cron on AWS EC2 - commands not running
问题:
我有一个 Laravel 5.4 artisan 任务,我需要通过 cron 运行 - 但它没有完成,尽管命令和调度程序(显然)设置正确。
这是 Laravel、php、apache、linux 还是 crontab 问题?最好的诊断方法是什么?
背景
在默认(亚马逊 AMI)EC2 实例上,artisan 命令被正确定义并且 运行s 完全来自项目目录(即 /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');
}
通过 sudo crontab -u apache -e
为 apache
添加了以下 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
检查的资源:
- https://askubuntu.com/q/23009
- https://github.com/laravel/framework/issues/13462
- https://laracasts.com/discuss/channels/servers/how-to-perform-php-artisan-schedulerun-on-an-ubuntu-server-with-laravel-53-for-cron-jobs?page=1
其他信息:
- 运行ning Laravel 5.4.16 由
php artisan --version
确定
- 运行ning PHP 7.1.3 由
php -v
确定
此问题与 php
在 cron 命令定义中缺少其(绝对)路径有关
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');
... 即使 运行ning 来自 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
祝你好运。
问题:
我有一个 Laravel 5.4 artisan 任务,我需要通过 cron 运行 - 但它没有完成,尽管命令和调度程序(显然)设置正确。
这是 Laravel、php、apache、linux 还是 crontab 问题?最好的诊断方法是什么?
背景
在默认(亚马逊 AMI)EC2 实例上,artisan 命令被正确定义并且 运行s 完全来自项目目录(即 /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');
}
通过 sudo crontab -u apache -e
为 apache
添加了以下 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
检查的资源:
- https://askubuntu.com/q/23009
- https://github.com/laravel/framework/issues/13462
- https://laracasts.com/discuss/channels/servers/how-to-perform-php-artisan-schedulerun-on-an-ubuntu-server-with-laravel-53-for-cron-jobs?page=1
其他信息:
- 运行ning Laravel 5.4.16 由
php artisan --version
确定
- 运行ning PHP 7.1.3 由
php -v
确定
此问题与 php
在 cron 命令定义中缺少其(绝对)路径有关
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');
... 即使 运行ning 来自 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
祝你好运。