Como adicionar um job ao cron/anacron ao criar um container Docker

Estou tentando adicionar um cron job simples para rodar no meu container Docker. Quero que ele seja adicionado durante a configuração, para que seja executado automaticamente quando ./launcher rebuild app for concluído.

O cron job funciona quando o adiciono manualmente ao arquivo /etc/cron.d/anacron usando vim, mas se eu editá-lo sem abrir e salvar o arquivo (ou seja, com echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron), o cron parece não detectar a alteração e não executa a tarefa.
Se, em seguida, eu adicionar um espaço em qualquer lugar do arquivo com vim e salvar, o cron detecta a alteração e começa a executar a tarefa.
Como as alterações não são detectadas ao adicioná-las com o comando echo, adicionar esse comando ao meu arquivo app.yml não funciona.
Também tentei docker restart app após inserir as alterações com echo, mas ainda assim não funcionou.

Sinto que deve haver uma maneira mais fácil que estou deixando passar. Ter que editar o arquivo anacron após a configuração parece ser o caminho errado para fazer isso.

Você pode explicar com mais detalhes o que está tentando fazer aqui?

Provavelmente, será muito mais fácil criar um plugin para seu fórum que execute em intervalos no Sidekiq.

Obrigado por me responder! Talvez isso faça mais sentido:

  • Estou executando um repositório do Discourse hospedado privadamente com alguns arquivos personalizados.
  • Tenho um arquivo no diretório script do Discourse chamado email_me.py.
  • Ao ser executado, esse arquivo me envia um e-mail dizendo “Hello World!”.
  • Quero criar um trabalho cron no contêiner Docker do Discourse que execute esse arquivo a cada minuto.
  • Isso pode ser feito adicionando manualmente a linha * * * * * root python3 /var/www/discourse/script/email_me.py ao arquivo /etc/cron.d/anacron usando um editor como vim.
  • Quero que o trabalho cron acima seja executado quando o contêiner do Discourse for configurado, mas não posso usar vim para isso a partir do arquivo app.yml.
  • Tentei usar echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron como um comando no arquivo app.yml. Isso adiciona com sucesso a linha ao arquivo anacron, mas o trabalho NÃO é executado (como se a alteração não tivesse sido registrada).

Estou simplesmente tentando encontrar uma maneira de fazer com que o trabalho:
* * * * * root python3 /var/www/discourse/script/email_me.py
seja executado após a reconstrução com ./launcher rebuild app.

Você deve realmente seguir o conselho do @eviltrout e fazer isso corretamente em um plugin usando nossos agendamentos de trabalho Sidekiq.

Mas, se quiser mexer nessas alterações não suportadas do cron, provavelmente precisará reiniciar o serviço após adicionar um trabalho com sv restart cron.

Para ficar mais claro, estou curioso sobre qual é o seu objetivo final, e não os passos que você está usando para alcançá-lo. Se o objetivo é receber um e-mail a cada minuto, isso pode ser feito em um job do Sidekiq dentro de um plugin, o que é significativamente mais simples.

Meu objetivo final é executar uma consulta no banco de dados em busca de atividade específica de usuários e enviar um e-mail com uma tabela contendo os resultados. Esse e-mail servirá como confirmação prévia de pagamento, pois os usuários que realizaram essa atividade específica serão pagos mais tarde no mesmo dia (via PayPal) por meio de outro script executado pelo cron.

Já tenho scripts capazes de fazer ambas as coisas, mas preciso encontrar uma maneira de fazer o container do Discourse executá-los uma vez por semana.

Não estou familiarizado com o Sidekiq. Se ele puder fazer isso, onde devo procurar para aprendê-lo?

Obrigado!

(Também tentei sv restart cron e muitas outras maneiras de reiniciar o cron, sem sucesso)

Eu começaria com a série de tutoriais de plugins para a estrutura básica de um plugin:

Se quiser um exemplo de como adicionar um job a um plugin, o plugin discourse-assign possui um que envia lembretes periódicos:

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

Você deve criar um plugin adequado, conforme sugerido, mas aqui está como fazer o que você pediu.

Você pode adicionar algo assim na seção run, perto do final do app.yml.

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

Você deve colocar tanto seu script quanto este arquivo em algum diretório mapeado sob shared, em vez de no diretório do Discourse.

Sim, funcionou perfeitamente. Eu precisei criar a pasta rr e os arquivos cron.d.rr. Coloquei minha tarefa agendada no arquivo cron.d.rr e o comando cp funcionou.

Obrigado!

Agora, vou me dedicar a escrever um plugin adequado…