Problema de Rsync com cron e nenhum problema manualmente

Problema de Rsync com cron e nenhum problema manualmente

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 ~/.keychaincontêm declarações de variáveis ​​de ambiente que definem SSH_AUTH_SOCKe 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.

informação relacionada