Я пытаюсь добавить простую задачу cron для запуска в моём Docker-контейнере. Мне нужно, чтобы она была добавлена на этапе настройки, чтобы автоматически выполняться после завершения команды ./launcher rebuild app.
Задача cron работает, когда я вручную добавляю её в файл /etc/cron.d/anacron с помощью vim, но если я редактирую файл, не открывая и не сохраняя его явно (например, командой echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron), cron, похоже, не замечает изменений и не запускает задачу.
Если же я затем добавлю пробел в любом месте файла с помощью vim и сохраню его, cron обнаружит изменения и начнёт выполнять задачу.
Поскольку изменения не фиксируются при добавлении через команду echo, добавление этой команды в мой файл app.yml не работает.
Я также пробовал выполнять docker restart app после добавления изменений через echo, но это тоже не помогло.
Мне кажется, что должен быть более простой способ, который я упускаю. Необходимость редактировать файл anacron после настройки кажется неправильным подходом.
Я запускаю приватно размещённый репозиторий Discourse с некоторыми пользовательскими файлами.
В директории script проекта Discourse у меня есть файл email_me.py.
При запуске этот файл отправляет мне письмо с текстом «Hello World!».
Я хочу создать задачу cron в Docker-контейнере Discourse, которая будет запускать этот файл каждую минуту.
Это можно сделать, вручную добавив строку * * * * * root python3 /var/www/discourse/script/email_me.py в файл /etc/cron.d/anacron с помощью редактора, например vim.
Мне нужно, чтобы эта задача cron запускалась при настройке контейнера Discourse, но я не могу использовать vim для этого из файла app.yml.
Я попробовал использовать команду echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron в файле app.yml. Это успешно добавляет строку в файл anacron, но задача НЕ выполняется (как будто изменения не были зарегистрированы).
Я просто пытаюсь найти способ заставить задачу: * * * * * root python3 /var/www/discourse/script/email_me.py
запускаться после пересборки с помощью ./launcher rebuild app.
Вам действительно стоит последовать совету @eviltrout и сделать это правильно в виде плагина, используя наши запланированные задания Sidekiq.
Однако, если вы хотите возиться с этими неподдерживаемыми изменениями в cron, вам, вероятно, потребуется перезапустить службу после добавления задания с помощью команды sv restart cron.
Также, чтобы прояснить ситуацию: меня интересует ваша конечная цель, а не шаги, которые вы используете для её достижения. Если цель — получать письмо каждую минуту, это можно реализовать через Sidekiq-задачу в плагине, что значительно проще.
Моя конечная цель — выполнить запрос к базе данных для поиска конкретной активности пользователей и отправить электронное письмо с таблицей, содержащей результаты. Это письмо будет служить подтверждением предварительной оплаты, так как пользователи, совершившие эту активность, получат оплату позже в тот же день (через PayPal) с помощью другого скрипта, запускаемого по расписанию cron.
У меня уже есть скрипты, способные выполнять обе эти задачи, но мне нужно найти способ заставить контейнер Discourse запускать их раз в неделю.
Я не знаком с Sidekiq. Если он может это сделать, где мне следует искать информацию, чтобы освоить его?
Спасибо!
(Также я пробовал sv restart cron и многие другие способы перезапуска cron, но безрезультатно)
Я бы начал с серии обучающих материалов по плагинам, чтобы понять базовую структуру плагина:
Если вы хотите пример того, как добавить задачу в плагин, обратите внимание на плагин discourse-assign: в нём есть задача для отправки периодических напоминаний:
Да, всё сработало идеально. Мне пришлось создать папку rr и файл cron.d.rr. Я поместил свою задачу cron в файл cron.d.rr, и команда cp выполнилась успешно.
Спасибо!
Теперь нужно заняться написанием полноценного плагина…