Diferença entre usar crontab e /etc/cron.hourly,daily,weekly

Diferença entre usar crontab e /etc/cron.hourly,daily,weekly

Eu tenho um script agendado que faz um backup svnsync de hora em hora de nossos repositórios Subversion. Eu estava executando-o a partir de uma entrada no crontab raiz sem problemas, mas decidi que gostaria de executá-lo em /etc/cron.hourly para obter visibilidade extra (e porque um de nossos engenheiros excluiu acidentalmente o crontab porque pensou "crontab -r" significava "ler o crontab ;-))

Todos os comandos svnsync no script cron.hourly falham com uma mensagem dizendo que o certificado SSL para o repositório SVN precisa ser aceito (esta é a mensagem que você recebe interativamente na primeira vez que o usuário acessa o repositório SVN, mas uma vez que o certificado eu aceito a mensagem não aparece novamente).

Portanto, parece-me que o script está sendo executado em um ambiente de usuário diferente quando executado a partir do cron.hourly e quando executado através do crontab raiz. Alguém pode explicar a diferença?

ATUALIZAÇÃO: eu deveria ter mencionado minha distro, estou usando anacron no CentOS 5.1.

ATUALIZAÇÃO 2: Obrigado pelas sugestões até agora; Acho que isso está se tornando mais uma questão do Subversion. Eu sempre tento encapsular meu ambiente em meus scripts, mas o problema aqui é que não tenho certeza do que há (ou falta) no ambiente que faz o SVN solicitar que o certificado SSL seja aceito quando executo meu script de cron.hora. Suponho que tenha algo a ver com a maneira como o script run-parts é executado.

Responder1

Você deseja usar a opção '--config-dir' para informar onde encontrar o certificado aceito (por exemplo, ~/.subversion por padrão).

Dito isto, tenho quase certeza de que seria melhor chamar o svnsync a partir do script hooks/post-commit, comosugerido em outro lugar. Então seu espelho estará sempre sincronizado, em vez de sincronizado com onde seu mestre estava há uma hora.

Responder2

No sistema Debian/Ubuntu, cron.daily|weekly|montly são iniciados a partir do crontab principal.

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Lembre-se também de que você provavelmente poderia colocar um fragmento crontab em /etc/cron.d/

Como você pode ver, não há nada de especial neste ambiente. Pelo menos no Debian/Ubuntu tudo é executado como conta root.

Quando escrevo scripts cron logo no início do script, sempre defino meu PATH e outras variáveis ​​de ambiente que usarei, para ter certeza de que funcionará corretamente em qualquer ambiente.

Responder3

Um crontab regular para todo o sistema é o crontab de um usuário específico e possui o campo nome de usuário, usado por /etc/crontab.

Usar scripts /etc/cron.*(de hora em hora, diariamente, semanalmente, mensalmente) é uma maneira mais limpa e fácil (evita erros comuns de sintaxe) de configurar o crontab para rooto usuário e isso é feito pela run-partsexecução de scripts ou programas em um diretório. Todas essas regras ainda são definidas no crontab de todo o sistema por padrão ( /etc/crontab), então é a mesma coisa.

Quando os cron jobs são manipulados por run-parts, são mais fáceis de depurar, pois você pode simplesmente testar quais scripts seriam executados exatamente (sem executá-los ainda) por:

sudo run-parts --report --test /etc/cron.daily

Responder4

No meu sistema RHEL 5.1, a variável de ambiente PATH é definida em/etc/crontab. Todas essas coisas no topo são coisas que alimentam o meio ambiente.

Se você reiniciar o cron, na primeira vez que ele for executado (se for /etc/crontabou /var/spool/cron/$USER), ele fará uma anotação em /var/log/cron. Caso contrário, apenas notará que cron.hourly foi executado

Meu crontab está configurado para o seguinte:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

O que você poderia fazer é colocar algo como o seguinte em /etc/cron.hourly:

env > /tmp/cron.env

Em seguida, inspecione o arquivo quando ele aparecer e modifique seu script (se puder) para definir o ambiente corretamente ou escreva um pequeno script wrapper que seu crontab chamará.

informação relacionada