У меня есть файл 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, действительно может отправлять электронную почту. Проведите тест.