
É possível fazer com que o cron receba instruções da saída de um script de shell em vez de ler um arquivo estático?
Estou tentando gerenciar crontabs em várias máquinas e manter arquivos crontab separados para cada máquina é uma tarefa árdua. Gostaria que o cron executasse um script de shell que imprimisse linhas crontab para cada trabalho com base no fato de uma determinada máquina estar atribuída a esse trabalho. Posso fazer isso?
PS- Já vi alguns sugerirem Puppet/Chef/etc. para esse propósito, mas acho que é um exagero lidar apenas com esse problema.
Responder1
Acho que a maneira mais fácil de fazer isso na maioria das distribuições seria usar ferramentas de implantação automatizadas como Puppet/Chef, bem como o diretório /etc/cron.d. Você pode colocar crontabs nesse diretório, exceto que eles usam o seguinte formato em vez do formato típico:
* * * * * <user> <command>
Onde está o usuário que executará o cron.
Você parece achar que o Puppet é um exagero (não é), mas a parte do diretório também se aplicaria a qualquer outra solução.
Responder2
Sim, claro que você pode fazer isso. Basta configurar qualquer script necessário para produzir a saída do crontab e enviá-lo para os servidores de destino.
Lá, um cron job estático pode ler especificamente esses crontabs para execução, de qualquer local que for conveniente.
Responder3
Este é exatamente o uso pretendido para fantoches e amigos.
Sua única entrada no crontab
poderia ser executar o agente fantoche, se você não gostar de como ele é configurado pelo gerenciamento de pacotes da sua distribuição.
O script externo estaria no puppet-master. Em um lugar. Para todas as máquinas.
Se for um problema suficiente considerar o uso de um script externo, recomendo o puppet. O Chef certamente pode fazer algo semelhante.
Comecei com o puppet apenas para gerenciar ~/.ssh/authorized_keys
em várias máquinas, o que é um "pequeno" problema semelhante.
Responder4
Um truque popular é criar uma entrada no crontab que atualize todo o crontab. Isso funcionará bem, desde que seu script de shell nunca alimente dados incorretos crontab
.
No entanto, sugiro uma abordagem diferente que será mais fácil de gerenciar: tenha uma entrada estática no crontab que execute um script com frequência. Faça com que o script faça todo o trabalho pesado para descobrir quando é hora de executar algo. Dessa forma, você ainda pode usar o crontab como um crontab normal sem precisar informar ao script tudo o que pode estar sendo executado em cada máquina.