Eu tenho um script de implantação, ele deve adicionar algo a um usuário crontab
(acionar um script que limpe os logs a cada XXX dias); no entanto, isso só deve ser feito durante a primeira implantação ou quando precisar ser atualizado.
(Eu posso correr xxx.py deploy env
ou xxx.py update env
)
então eu tenho que fazer isso:
Check if my cronJob already exist
Put my cronJob if it does not already exist
or
update my cronjob if one of the parameter of the command is different
Não vejo como adicionar / verificar / remover algo crontab
sem usar crontab -e
ou editar o crontab
arquivo (faça o download, reescreva-o, faça o upload novamente)
PS: este é um cronjob específico do usuário, "webadmin" fará isso e ele não deve usar o sudo para fazer isso.
/etc/cron.d
? Se assim for, colocar o script lá usando um nome único para a sua aplicação/etc/crontab
, os arquivos/etc/cron.d/
têm um campo extra para o nome de usuário, imediatamente após a especificação da programação. por exemplo* * * * * username /path/to/script
. Vejaman 5 crontab
e pesquiseSYSTEM CRON
.Respostas:
minha melhor ideia até agora
para verificar primeiro se o conteúdo corresponde ao que deveria estar lá e somente atualizar se não:
mas isso é complicado o suficiente para criar um script separado em torno dessa tarefa cron.
outras idéias
você pode enviar a string via stdin para o crontab (cuidado, isso limpa todas as entradas anteriores do crontab):
isso deve funcionar mesmo através do ssh:
se você deseja anexar ao arquivo, você pode usar isto:
fonte
echo '*...
expandiu o*
arquivo para uma lista de arquivos. 2) as terminações de linha no crontab foram excluídas.echo "*...
e 2) removaecho $
do início da linha.Para o registro, vou sugerir o uso
/etc/cron.d/
. Somente o root pode gravar arquivos aqui, mas as entradas podem ser executadas como qualquer usuário (sem necessidadesudo
).Isso pode ser aplicado várias vezes, atualizando o
webadmin.cron
arquivo local conforme necessário antes de copiá-lo.Você pode até remover o provisionamento:
Observe que, em muitos casos, você não pode fornecer a senha do root para os comandos
scp
/ssh
. Em vez disso, você precisa configurar certificados de chave pública / privada. Além disso, implicitamente, a conta local (seja ela qual for) terá acesso root completo ao servidor remoto. Não está claro no momento se isso seria uma barreira para o seu cenário específico.fonte
/etc/cron.d/
existe exatamente para esse fim - para que pacotes / implantações possam simplesmente colocar um arquivo crontab aqui.Eu recomendo usar o Ansible * para isso, em vez de usar o seu. Ou Puppet ou Chef - mas o Ansible é adequado para scripts de implantação de infraestrutura zero como este.
Isso ocorre porque já existem módulos destinados a resolver problemas como esse, e as ferramentas de gerenciamento de configurações têm a idempotência como um objetivo básico de design - essa é a propriedade de mudar apenas quando necessário, mesmo que você acidentalmente (ou intencionalmente) execute novamente.
Em particular, o módulo cron do Ansible pode modificar as crontabs do usuário. Como bônus, se você quiser se ajustar mais tarde para usar os crontabs do sistema, será um ajuste muito fácil, e não uma reescrita.
* aviso: trabalho para a Red Hat, e o Ansible é um projeto patrocinado pela Red Hat.
fonte
Se você deseja adicionar um trabalho cron através da conta de destino, execute
crontab -e
. Este comando passa o crontab através de um editor. Diga a ele para usar um comando de editor que modifique o crontab como desejar. O comando do editor é executado como um snippet de shell com o nome de um arquivo temporário anexado.Essa abordagem é mais confiável que a nativa,
crontab -l | … | crontab -
porque esta é vulnerável a uma condição de corrida se o crontab for editado simultaneamente: as modificações feitas entre a chamadacrontab -l
e a chamadacrontab -
serão desfeitas.fonte
Esta é uma adaptação do que o @ phillip-zyan-k-lee-stockmann ofereceu, com base no código "Melhor idéia até agora".
Minhas alterações a partir dele (excelente e útil trecho) são basicamente:
E aqui está o meu código para o que eu chamei
crontab-add-hourly.sh
:Exemplo de uso e saída:
fonte
TL; DR: Isso realmente funciona, testado no Bash 4.4.
Conforme observado nos comentários da resposta @Phillip -Zyan K Lee- Stockmann, essa solução se expande
*
em todos os arquivos no diretório atual. Não consegui que a sugestão dos comentários funcionasse. set -f desativa a expansão de curinga, consulte https://stackoverflow.com/a/11456496/915441 .fonte