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 root
o usuário e isso é feito pela run-parts
execuçã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/crontab
ou /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á.