Laravel AWS 上的计划任务不工作

Laravel Scheduling Task on AWS is not working

我正在将我的 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 仅适用于 worker 环境

/opt/elasticbeanstalk/support/envvars 仅适用于 亚马逊 Linux 1。由于您使用的是 64bit Amazon Linux 2 v3.0.3 running PHP 7.3(我记得),cron 会出错。

因此,您应该关注第二种方法,它与 AWS 博客 中有关如何在 AL2 上使用 cron 的内容一致:

因此,我建议通过博客中所示的脚本(例如,/usr/local/bin/myscript.sh)执行 cron 作业。

修改了 /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