Docker コンテナ作成時に cron/anacron にジョブを追加する方法

Docker コンテナ内で実行する単純な cron ジョブを追加しようとしています。設定時に追加し、./launcher rebuild app が完了した際に自動的に実行されるようにしたいと考えています。

vim を使って /etc/cron.d/anacron ファイルに手動で追加すれば cron ジョブは機能しますが、ファイルを開いて保存せずに編集した場合(例:echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron)、cron は変更を検知せず、ジョブを実行しません。
その後、vim でファイル内のどこかにスペースを追加して保存すると、cron は変更を検知し、ジョブを実行し始めます。
echo コマンドで追加した場合は変更が検知されないため、このコマンドを app.yml ファイルに追加しても機能しません。
また、変更を反映させた後に docker restart app を試してみましたが、それでも機能しませんでした。

もっと簡単な方法があるはずだと感じています。設定後に anacron ファイルを編集する必要があるのは、正しいやり方ではないように思えます。

ここで何をしようとしているのか、もう少し詳しく説明してもらえますか?

Sidekiq で一定間隔で実行されるプラグインをフォーラム用に作成する方が、はるかに簡単になるでしょう。

返信ありがとうございます!これで少しはわかりやすくなるかもしれません:

  • 私はいくつかのカスタムファイルを含んだ、プライベートホストの Discourse リポジトリを運用しています。
  • Discourse の script ディレクトリに email_me.py というファイルがあります。
  • このファイルを実行すると、「Hello World!」というメールが私に送られます。
  • Discourse の Docker コンテナ内で、このファイルを毎分実行する cron ジョブを作成したいと考えています。
  • これを実現するには、vim などのエディタを使って /etc/cron.d/anacron ファイルに * * * * * root python3 /var/www/discourse/script/email_me.py という行を手動で追加すればよいです。
  • しかし、Discourse コンテナのセットアップ時に上記の cron ジョブを実行させたい場合、app.yml ファイルから vim を使用することはできません。
  • そこで、app.yml ファイル内のコマンドとして echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron を試しました。これにより anacron ファイルに正しく行が追加されましたが、ジョブは実行されませんでした(変更が反映されていないかのように見えます)。

単に、./launcher rebuild app で再構築した後に、以下のジョブが実行される方法を探しています:
* * * * * root python3 /var/www/discourse/script/email_me.py

Sidekiq のスケジューリング機能を用いたプラグインで、@eviltrout さんのアドバイスをぜひ正しく実行してください。

ただし、crontab への非公式な変更を試みる場合は、sv restart cron でジョブを追加した後、サービスを再起動する必要があるでしょう。

より明確にするために、あなたが目指す最終目標が何なのか、そしてそのためにどの手順を踏んでいるのかについて知りたいのです。もし目標が「1 分ごとにメールが届くようにすること」であれば、プラグイン内の Sidekiq ジョブで実現でき、はるかにシンプルになります。

私の最終的な目標は、特定のユーザーのアクティビティを検索するデータベースクエリを実行し、その結果を含むテーブルを記載したメールを送信することです。このメールは、前払い確認として機能します。なぜなら、この特定のアクティビティを行ったユーザーは、後日、cron によって実行される別のスクリプトを通じて PayPal で支払われるからです。

すでにこれら両方の機能を実行できるスクリプトは持っていますが、Discourse コンテナから週に一度それらを実行する方法を見つける必要があります。

Sidekiq については詳しくありません。もし Sidekiq でこれが可能なら、どこから学ぶべきでしょうか?

ありがとうございます!

(また、sv restart cronや他の多くの方法で cron を再起動しようとしましたが、うまくいきませんでした)

まずは、プラグインの基本的な構造を学ぶために、プラグインチュートリアルシリーズから始めることをお勧めします。

プラグインにジョブを追加する方法の例としては、discourse-assign プラグインがあります。このプラグインには、定期的なリマインダーを送信するジョブが含まれています。

https://github.com/discourse/discourse-assign/blob/master/jobs/scheduled/enqueue_reminders.rb

推奨されているように、適切なプラグインを作成すべきですが、ご質問の対応方法は以下の通りです。

app.yml の末尾にある run セクションに、以下のような記述を追加してください。

  - exec: cp /shared/rr/cron.d.rr /etc/cron.d/rr

スクリプトとこのファイルを、discourse ディレクトリではなく shared 下にマッピングされているディレクトリに配置してください。

はい、完全に動作しました。rr フォルダと cron.d.rr ファイルを作成する必要がありました。cron ジョブを cron.d.rr ファイルに記述し、cp が正常に動作しました。

ありがとうございます!

次は、適切なプラグインを作成する方法を検討します…