laravel - AWS 上的 Laravel 调度任务不起作用
问题描述
我正在将我的 Laravel 应用程序部署到 ElasticBeanstalk 环境中。我正在尝试在服务器上的调度任务中运行命令。但它不起作用。这就是我所做的。
我在 Kernel.php 文件中安排我的命令如下。
$schedule->command('counter:update')->everyMinute()->onOneServer();
我使用 Redis 作为我的缓存驱动程序,它正在工作。
然后我尝试了两种不同的方法。
第一种方法:使用 Laravel AWS Worker 包,https ://packagist.org/packages/dusterio/laravel-aws-worker
我按照文档中提到的说明安装了软件包。
然后,我将 CSRF 中间件中文档中提到的工作路由列入白名单。
然后我在项目的根文件夹中创建了一个 cron.yml 文件,其中包含以下内容。
version: 1
cron:
- name: "schedule"
url: "/worker/schedule"
schedule: "* * * * *"
然后我部署了我的应用程序。但是调度任务不起作用。所以我尝试了第二种方法如下。
第二种方法:使用 Crontab
我创建了一个包含以下内容的 .ebextensions/cronjob.config 文件。
files:
"/etc/cron.d/schedule_run":
mode: "000644"
owner: root
group: root
content: |
* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/artisan schedule:run 1>> /dev/null 2>&1
commands:
remove_old_cron:
command: "rm -f /etc/cron.d/*.bak"
然后我部署了我的应用程序。第二种方法也不起作用。我的配置中缺少什么以及如何使其正常工作?
这是我的另一个 cronjob.config 文件。
files:
"/etc/cron.d/mycron":
mode: "000644"
owner: root
group: root
content: |
* * * * * root /usr/local/bin/myscript.sh
"/usr/local/bin/myscript.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
date > /tmp/date
* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/artisan schedule:run 1>> /dev/null 2>&1
exit 0
commands:
remove_old_cron:
command: "rm -f /etc/cron.d/mycron.bak"
解决方案
您尝试的cron.yml
仅适用于工作环境。
/opt/elasticbeanstalk/support/envvars
仅适用于Amazon Linux 1。由于您正在使用64bit Amazon Linux 2 v3.0.3 running PHP 7.3
(我记得),因此 cron 会出错。
因此,您应该关注第二种方法,这与AWS 博客关于如何在 AL2 上使用 cron 一致:
因此,我建议cron
通过脚本(例如,/usr/local/bin/myscript.sh
)执行作业,如博客中所示。
修改内容为/usr/local/bin/myscript.sh
。
您只能先尝试date > /tmp/date
检查 cron 作业是否有效。为此,您必须部署您的应用程序,并检查是否/tmp/date
包含此脚本生成的时间。
"/usr/local/bin/myscript.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
date > /tmp/date
# the line below is commented out.
#/usr/bin/php /var/www/html/artisan schedule:run 1>> /dev/null 2>&1
exit 0
在 Amazon Linux 2 中访问环境变量
环境变量存储在/opt/elasticbeanstalk/deployment/env
因此,要将它们加载到您的脚本中,您可以使用以下内容:
env $(cat /opt/elasticbeanstalk/deployment/env | xargs) sh -c '/usr/bin/php /var/www/html/artisan schedule:run 1>> /dev/null 2>&1'
或两行
export $(cat /opt/elasticbeanstalk/deployment/env | xargs)
/usr/bin/php /var/www/html/artisan schedule:run 1>> /dev/null 2>&1
推荐阅读
- python - 如何在启动 Django 项目时集成 python 脚本以运行
- javascript - 使用 jquery 创建表并选择选项。选项更改时如何隐藏以前的表值?
- python - 修复python中的keyerror
- dns - 如何更改子域名并使用旧名称重定向
- javascript - React/Redux - 尽管 Redux 状态发生变化,组件仍未更新
- c# - 使用 UnevenRows 更新 TableView 中的 ViewCell 无法正常工作 Xamarin.Forms
- visual-studio - 无法加载项目文件。缺少根元素
- html - 使用 Flexbox 使图片和文本居中
- c# - Unity TextMesh Pro 颜色标签被忽略?
- javascript - 类是否可以与原型互操作