Laravel Задача планирования на AWS не работает - PullRequest
3 голосов
/ 14 июля 2020

Я развертываю свое приложение Laravel в среде ElasticBeanstalk. Я пытаюсь запустить команду в задаче планирования на сервере. Но это не работает. Это то, что я сделал.

Я планирую свою команду в ядре. php файл, как показано ниже.

$schedule->command('counter:update')->everyMinute()->onOneServer();

Я использую Redis в качестве драйвера кеша, и он работает.

Затем я попробовал два разных подхода.

Первый подход: Использование Laravel AWS Worker package , https://packagist.org/packages/dusterio/laravel-aws-worker

Я установил пакет, следуя инструкциям, приведенным в do c.

Затем я занесу в белый список рабочие маршруты, упомянутые в do c, в промежуточном программном обеспечении CSRF.

Затем я создал файл cron.yml прямо в папке проекта root со следующим содержимым:

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"

1 Ответ

2 голосов
/ 14 июля 2020

cron.yml, который вы пробовали, предназначен только для рабочих сред .

/opt/elasticbeanstalk/support/envvars предназначен только для Amazon Linux 1 . Поскольку вы используете 64bit Amazon Linux 2 v3.0.3 running PHP 7.3 (насколько я помню), cron выдаст ошибку.

Таким образом, вам следует сосредоточиться на втором подходе, который соответствует AWS blog о том, как использовать cron на AL2:

Поэтому я бы рекомендовал выполнить задание 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

Переменные env хранятся в /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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...