Cron 作业在 Elastic Beanstalk 中不起作用

Cron job not working in Elastic Beanstalk

我已经使用负载平衡在 Elastic Beanstalk 中部署了一个 laravel 应用程序。我必须每天备份我的数据库并将其存储在 s3 存储桶中,所以我使用 Laravel-backup-server 包。我已经使用 Nginx 设置了 cronjob。当我在我的本地机器上手动 运行 php artisan schedule:run 它工作正常但是当我部署到 Aws 时它不是 运行 宁 cron 作业。我的设置看起来像这样

.ebextensions/cron-setup.config

"/etc/cron.d/cron_example":
    mode: "000644"
    owner: root
    group: root
    content: |
      * * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/artisan schedule:run 1>> /laralog.log 2>&1
commands:
  rm_old_cron:
    command: "rm -fr /etc/cron.d/cron_example.bak"
    ignoreErrors: true

app\Console\Kernel.php

protected function schedule(Schedule $schedule)
{
    $schedule->command('backup:run --only-db')
    ->everyMinute();
    Log::info('running cron');
    
}

我正在使用 cloudwatch 进行日志记录。当我在本地 运行 php artisan schedule:run 时,我正在登录云监视。但是当我将它部署到 Elastic beanstalk 并在 ngnix 中设置 cron 时,没有日志。

此外,我尝试使用我在 Github 中找到的这个配置我没有做任何更改但没有工作

    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"

创建新的 cron 文件后尝试重新加载 cron 服务。

service cron reload

或您的 EB 正在使用的 OS 之类的东西。

这是我在 EBS 上的做法:

files:
"/etc/cron.d/artisan-scheduler":
    mode: "000644"
    owner: root
    group: root
    content: |
        * * * * * webapp /usr/local/bin/artisan-scheduler-cron.sh

"/var/log/laravel-schedule.log":
    mode: "000755"
    owner: webapp
    group: webapp
    content: |
        created

"/usr/local/bin/artisan-scheduler-cron.sh":
    mode: "000755"
    owner: webapp
    group: webapp
    content: |
        #!/bin/bash

        /usr/bin/php /var/app/current/artisan schedule:run >> /var/log/laravel-schedule.log 2>&1
        exit 0

commands:
01_mkdir_webapp_dir:
    # use the test directive to create the directory
    # if the mkdir command fails the rest of this directive is ignored
    test: "mkdir /home/webapp"
    command: "ls -la /home/webapp"
02_chown_webapp_dir:
    command: "chown webapp:webapp /home/webapp"
03_chmod_webapp_dir:
    command: "chmod 700 /home/webapp"
remove_old_cron:
    command: "rm -f /etc/cron.d/artisan-scheduler.bak"

最后,我从脚本调用 artisan 并 运行 Cron 作业中的脚本。 Laravel 时间表在 Kernel.php 中照常宣布。请注意,“日志”部分与您的问题无关。

您也可以尝试一个简单的计划任务来检查计划程序是否工作:

$schedule->call(function () {
        Log::info('[SCHEDULE] test schedule');
    })
        ->name('test-schedule')
        ->withoutOverlapping(720) //12h
        ->everyMinute()
        ->onOneServer();

此外,SSH 到您的服务器并检查其他日志。 artisan 命令可能还有另一个错误,但在“shell”级别,它没有达到 PHP/Laravel,因此 Cloudwatch 中没有关于它的日志。

来源:1, 2 & 3.

经过多次努力,我找到了一种替代方法 运行 cron 作业

创建路线

routes/web.php

Route::get('/cron/run',[HomeController::class, 'cron'])->name('cron');

在 HomeController 中创建一个函数

public function cron()
{
    \Artisan::call("schedule:run");
    return 'run cron successful';
}

运行 URL 每分钟使用 https://cron-job.org/en/