Rsync problema com cron e sem problemas manualmente

3

Eu tenho um arquivo backup.sh que ativa um comando rsync. Este rsync é fazer backup do meu servidor dedicado em um RaspberryPi rodando raspbian.

(eu uso chaves, então não preciso digitar nenhuma senha, etc.)

O problema é que quando eu lanço o lote manualmente tudo funciona, mas quando é o crontab (com o mesmo usuário) eu 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á o 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]

Atenciosamente

    
por mephissto 08.10.2013 / 00:03

3 respostas

3

(I use keychain so I don't need to type any password etc ...)

Ok, então você precisa dizer ao programa em execução no seu cron job como encontrar o seu chaveiro.

O SSH procura um agente SSH (que keychain emula) por meio da variável de ambiente SSH_AUTH_SOCK . Então você precisa definir essa variável de ambiente no seu crontab.

Em uma configuração típica, SSH_AUTH_SOCK é um caminho para um soquete com um nome aleatório. Desde que você está usando chaves, você pode facilmente encontrar um nome alternativo para esse socket: chaveiro grava arquivos ~/.keychain que contêm declarações de variáveis ambientais que estabelecem SSH_AUTH_SOCK e outras variáveis semelhantes ( SSH_AGENT_PID , GPG_AGENT_INFO ). Então, basta incluir o arquivo apropriado em seu cron job.

[email protected]
30 5  *   *   *     . ~/.keychain/$(hostname)-sh; /home/user/backup.sh

(Aparte:.. Cron tem um built-in recurso para enviar e-mail com a saída do trabalho, de modo que você receber um e-mail apenas se o trabalho não produzir alguma saída Não há necessidade de mexer com | mail )

    
por 08.10.2013 / 03:16
3

A conexão ssh não está funcionando no cronjob. Como é suposto estar realizando autenticação SSH? Nenhuma tentativa de listar uma chave de identidade ou senha é visível. Eu colocaria um '-i' com o caminho para a sua (sem senha ...), se é assim que funciona. As principais diferenças entre a linha de comando e o cronjob tendem a estar no ambiente (coisas como variáveis de ambiente, falta de um terminal de controle, etc.)

    
por 08.10.2013 / 00:36
1

Acho que você tem um problema de citação em seu assunto:

mail -s "Backup RPi "$(date +\%d/\%m/\%Y-\%X) [email protected]

Deve ser assim:

mail -s "Backup RPi $(date +\%d/\%m/\%Y-\%X)" [email protected]

Abordagem Alternativa

Eu também colocaria o email no script.

#!/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 esta:

30 5  *   *   *     /home/user/backup.sh

Verifique também se a conta que está executando esse cron pode, de fato, enviar um email. Faça um teste.

    
por 08.10.2013 / 01:24