Проблема с rsync с cron и нет проблем вручную

Проблема с rsync с cron и нет проблем вручную

У меня есть файл backup.sh, который запускает команду rsync. Этот rsync предназначен для резервного копирования моего выделенного сервера на RaspberryPi с запущенным raspbian.

(Я использую связку ключей, поэтому мне не нужно вводить пароль и т. д.)

Проблема в том, что когда я запускаю пакет вручную, все работает, но когда это crontab (с тем же пользователем), у меня возникает следующая ошибка:

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]

Вот мой файл 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)

А теперь строка 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]

С уважением

решение1

(Я использую связку ключей, поэтому мне не нужно вводить пароль и т. д.)

Итак, вам нужно указать программе, запущенной в вашем задании cron, как найти вашу связку ключей.

SSH ищет агента SSH (который эмулирует keychain) через переменную окружения SSH_AUTH_SOCK. Поэтому вам нужно установить эту переменную окружения в вашем crontab.

В типичной конфигурации SSH_AUTH_SOCK— это путь к сокету со случайным именем. Поскольку вы используете keychain, вы можете легко найти альтернативное имя для этого сокета: keychain записывает файлы, ~/.keychainсодержащие объявления переменных среды, которые устанавливают SSH_AUTH_SOCKи другие подобные переменные ( SSH_AGENT_PID, GPG_AGENT_INFO). Поэтому просто включите соответствующий файл в задание cron.

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

(Кстати: cron имеет встроенную функцию отправки почты с результатами выполнения задания, так что вы получите письмо только в том случае, если задание произведет какой-либо вывод. Нет необходимости возиться с | mail.)

решение2

SSH-соединение не работает из cronjob. Как он должен выполнять аутентификацию SSH? Не видно никаких попыток перечислить ключ идентификации или пароль. Я бы добавил '-i' с путем к вашему (незапароленный...) ключу, если это так работает. Основные различия между командной строкой и cronjob, как правило, сводятся к среде (оба типа переменных среды, отсутствие управляющего терминала и т. д.)

решение3

Мне кажется, у вас проблемы с цитированием по вашей теме:

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

Должно быть так:

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

Альтернативный подход

Я бы также включил электронное письмо в сценарий.

#!/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]

Затем измените запись в crontab на следующую:

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

Также убедитесь, что учетная запись, которая запускает этот cron, действительно может отправлять электронную почту. Проведите тест.

Связанный контент