Ось як я додав завдання cron до Elastic Beanstalk:
Створіть папку в кореневій частині програми, яка називається .ebextensions, якщо вона ще не існує. Потім створіть файл конфігурації всередині папки .ebextensions. Я буду використовувати example.config для цілей ілюстрації. Потім додайте це до example.config
container_commands:
01_some_cron_job:
command: "cat .ebextensions/some_cron_job.txt > /etc/cron.d/some_cron_job && chmod 644 /etc/cron.d/some_cron_job"
leader_only: true
Це файл конфігурації YAML для Elastic Beanstalk. Переконайтесь, що при копіюванні цього у текстовий редактор ваш текстовий редактор використовує пробіли замість вкладок. В іншому випадку ви отримаєте помилку YAML, коли надішлете це на EB.
Отже, це робить команду під назвою 01_some_cron_job. Команди виконуються в алфавітному порядку, тому 01 гарантує, що вони виконуються як перша команда.
Потім команда бере вміст файлу, який називається some_cron_job.txt, і додає його до файлу, який називається some_cron_job у /etc/cron.d.
Потім команда змінює дозволи у файлі /etc/cron.d/some_cron_job.
Клавіша leader_only забезпечує виконання команди лише в екземплярі ec2, який вважається лідером. Замість того, щоб запускатись на кожному екземплярі ec2, який у вас може бути запущений.
Потім створіть файл з назвою some_cron_job.txt усередині папки .ebextensions. Ви розмістите свої завдання cron у цьому файлі.
Так наприклад:
# The newline at the end of this file is extremely important. Cron won't run without it.
* * * * * root /usr/bin/php some-php-script-here > /dev/null
Отже, це завдання cron буде виконуватися щохвилини кожної години кожного дня як кореневий користувач і відкидатиме вихідні дані до / dev / null. / usr / bin / php - шлях до php. Потім замініть some-php-script-here на шлях до вашого php-файлу. Це, очевидно, передбачає, що вашій роботі cron потрібно запустити файл PHP.
Крім того, переконайтеся, що у файлі some_cron_job.txt є новий рядок у кінці файлу, як зазначено в коментарі. Інакше cron не запускатиметься.
Оновлення:
Є проблема з цим рішенням, коли Elastic Beanstalk масштабує ваші екземпляри. Наприклад, скажімо, у вас є один екземпляр із запущеним завданням cron. Ви отримуєте збільшення трафіку, тому Elastic Beanstalk масштабує вас до двох екземплярів. Leader_only забезпечить, щоб між двома екземплярами працювала лише одна робота cron. Ваш трафік зменшується, і Elastic Beanstalk масштабує вас до одного екземпляра. Але замість припинення другої інстанції Elastic Beanstalk припиняє першу інстанцію, яка була лідером. Тепер у вас немає запущених завдань cron, оскільки вони працювали лише в першому екземплярі, який було припинено. Див. Коментарі нижче.
Оновлення 2:
Просто пояснивши це з коментарів нижче: AWS тепер має захист від автоматичного припинення примірника. Просто увімкніть його у своєму екземплярі лідера, і все готово. - Ніколас Аревало 28 жовтня 2016 року о 9:23