Eu tenho um arquivo backup.sh que inicia um comando rsync. Este rsync serve para fazer backup do meu servidor dedicado em um RaspberryPi rodando raspbian.
(Eu uso chaveiro então não preciso digitar nenhuma senha etc...)
O problema é que quando inicio o batch manualmente tudo funciona, mas quando é crontab (com o mesmo usuário) tenho o seguinte erro:
2013/10/07 19:36:02 [6456] rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
2013/10/07 19:36:02 [6456] rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9]
Aqui está meu arquivo backup.sh
#!/bin/bash
echo "_ backup start "$(date +%H:%M:%S)
echo " "
/usr/bin/rsync -avh --rsync-path='/usr/bin/rsync' --delete --log-file='/home/user/rsync.'$(date +%d%m%Y-%H%M%S)'.log' --rsh='ssh -p 1234' [email protected]:/path/to/archives/ /media/backup/
echo " "
echo "_ backup end "$(date +%H:%M:%S)
E agora a linha crontab (crontab -e)
# m h dom mon dow command
30 5 * * * /home/user/backup.sh | mail -s "Backup RPi "$(date +\%d/\%m/\%Y-\%X) [email protected]
Cumprimentos
Responder1
(Eu uso chaveiro então não preciso digitar nenhuma senha etc...)
Ok, então você precisa informar ao programa em execução em seu cron job como encontrar seu chaveiro.
O SSH procura um agente SSH (que emula o chaveiro) por meio da variável de ambiente SSH_AUTH_SOCK
. Então você precisa definir esta variável de ambiente em seu crontab.
Em uma configuração típica, SSH_AUTH_SOCK
é um caminho para um soquete com um nome aleatório. Como você está usando o keychain, você pode facilmente encontrar um nome alternativo para esse soquete: o keychain grava arquivos que ~/.keychain
contêm declarações de variáveis de ambiente que definem SSH_AUTH_SOCK
e outras variáveis semelhantes ( SSH_AGENT_PID
, GPG_AGENT_INFO
). Portanto, basta incluir o arquivo apropriado em seu cron job.
[email protected]
30 5 * * * . ~/.keychain/$(hostname)-sh; /home/user/backup.sh
(Além disso: o cron possui um recurso integrado para enviar e-mails com a saída do trabalho, de forma que você receba um e-mail somente se o trabalho produzir alguma saída. Não há necessidade de mexer com | mail
.)
Responder2
A conexão ssh não está funcionando no cronjob. Como deveria realizar a autenticação SSH? Nenhuma tentativa de listar uma chave de identidade ou senha é visível. Eu colocaria um '-i' no caminho para sua chave (sem senha ...) se é assim que funciona. As principais diferenças entre linha de comando e cronjob tendem a estar relacionadas ao ambiente (tanto coisas como variáveis de ambiente, falta de um terminal de controle, etc.)
Responder3
Acho que você tem um problema de citação no seu assunto:
mail -s "Backup RPi "$(date +\%d/\%m/\%Y-\%X) [email protected]
Deveria ser isso:
mail -s "Backup RPi $(date +\%d/\%m/\%Y-\%X)" [email protected]
Abordagem alternativa
Eu incluiria o e-mail no script também.
#!/bin/bash
(
echo "_ backup start "$(date +%H:%M:%S)
echo " "
/usr/bin/rsync -avh --rsync-path='/usr/bin/rsync' --delete \
--log-file='/home/user/rsync.'$(date +%d%m%Y-%H%M%S)'.log' \
--rsh='ssh -p 1234' [email protected]:/path/to/archives/ /media/backup/
echo " "
echo "_ backup end "$(date +%H:%M:%S)
) | mail -s "Backup RPi $(date +\%d/\%m/\%Y-\%X)" [email protected]
Em seguida, altere a entrada do crontab para isto:
30 5 * * * /home/user/backup.sh
Certifique-se também de que a conta que está executando este cron pode de fato enviar e-mail. Faça um teste.