Come aggiungere un job a cron/anacron durante la creazione di un contenitore Docker

Sto cercando di aggiungere un semplice cron job da eseguire nel mio container Docker. Voglio che venga aggiunto durante la configurazione in modo che venga eseguito automaticamente al completamento di ./launcher rebuild app.

Il cron job funziona quando lo aggiungo manualmente al file /etc/cron.d/anacron con vim, ma se lo modifico senza aprire e salvare il file (ad esempio con echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron), cron non sembra rilevare la modifica e non esegue il job.
Se poi aggiungo uno spazio da qualche parte nel file con vim e salvo, cron rileva la modifica e inizia a eseguire il job.
Poiché le modifiche non vengono rilevate quando vengono aggiunte con il comando echo, aggiungere questo comando al mio file app.yml non funziona.
Ho anche provato a eseguire docker restart app dopo aver aggiunto le modifiche con echo, ma senza successo.

Sento che dovrebbe esserci un modo piĂą semplice che mi sfugge. Dovere modificare il file anacron dopo la configurazione sembra essere la strada sbagliata da percorrere.

Puoi spiegare in modo piĂą dettagliato cosa stai cercando di fare qui?

Probabilmente ti sarĂ  molto piĂą semplice creare un plugin per il tuo forum che venga eseguito a intervalli regolari tramite Sidekiq.

Grazie per avermi risposto! Forse questo chiarirĂ  meglio la situazione:

  • Sto eseguendo un repository Discourse ospitato privatamente con alcuni file personalizzati.
  • Ho un file nella directory script di Discourse chiamato email_me.py.
  • Quando eseguito, questo file mi invia un’email con scritto “Hello World!”.
  • Voglio creare un job cron nel container Docker di Discourse che esegua questo file ogni minuto.
  • Questo può essere ottenuto aggiungendo manualmente la riga * * * * * root python3 /var/www/discourse/script/email_me.py al file /etc/cron.d/anacron utilizzando un editor come vim.
  • Voglio che il job cron sopra descritto venga eseguito quando il container Discourse viene configurato, ma non posso usare vim per farlo dal file app.yml.
  • Ho provato a usare echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron come comando nel file app.yml. Questo aggiunge correttamente la riga al file anacron, ma il job NON viene eseguito (come se la modifica non fosse stata registrata).

Sto semplicemente cercando un modo per far sì che il job:
* * * * * root python3 /var/www/discourse/script/email_me.py
venga eseguito dopo un rebuild con ./launcher rebuild app.

Dovresti davvero seguire il consiglio di @eviltrout e farlo correttamente in un plugin utilizzando i nostri lavori pianificati di Sidekiq.

Ma se vuoi giocare con queste modifiche non supportate a cron, probabilmente dovrai riavviare il servizio dopo aver aggiunto un lavoro con sv restart cron.

Per essere più chiari, sono curioso di conoscere il tuo obiettivo finale, non i passaggi che stai utilizzando per raggiungerlo. Se l’obiettivo è ricevere un’email ogni minuto, puoi farlo in un job Sidekiq all’interno di un plugin ed è significativamente più semplice.

Il mio obiettivo finale è eseguire una query sul database per cercare attività specifiche degli utenti e inviare un’email con una tabella contenente i risultati. Questa email fungerà da conferma pre-pagamento, poiché gli utenti che hanno svolto questa specifica attività verranno pagati più tardi nella giornata (tramite PayPal) tramite un altro script eseguito da cron.

Ho già degli script in grado di fare entrambe le cose, ma devo solo trovare un modo per far sì che il container di Discourse li esegua una volta a settimana.

Non sono familiare con Sidekiq. Se può gestire questo compito, dove posso cercare per impararlo?

Grazie!

(Ho anche provato sv restart cron e molti altri metodi per riavviare cron, ma senza successo)

Inizierei con la serie di tutorial sui plugin per la struttura di base di un plugin:

Se desideri un esempio su come aggiungere un job a un plugin, il plugin discourse-assign ne ha uno che invia promemoria periodici:

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

Dovresti scrivere un plugin appropriato come suggerito, ma ecco come fare ciò che hai chiesto.

Puoi aggiungere qualcosa del genere nella sezione run alla fine di app.yml.

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

Voglio che tu metta sia il tuo script che questo file in una directory mappata sotto shared invece che nella directory di Discourse.

Sì, ha funzionato perfettamente. Ho dovuto creare la cartella rr e i file cron.d.rr. Ho inserito il mio lavoro pianificato nel file cron.d.rr e il comando cp ha funzionato.

Grazie!

Ora mi dedicherò a scrivere un plugin adeguato…