3

У меня есть эта команда rsync которая прекрасно работает, когда я запускаю ее из командной строки (Ubuntu Server 12.04.1 LTS). Мне бы хотелось, чтобы он запускался каждый час, каждый час и выводил результаты (вместе с ошибками) в файл журнала. Вот команда, которую я поместил в crontab:

0 * * * * root rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" 
user@host:/path/to/dir/ user@host:/path/to/another/dir/ /destination/dir
--exclude='.DS_Store' &> /var/log/backup/`date '+%Y_%m_%d_%H:%M'`_hourlybackup.log

Несмотря на то, что он работает точно так, как я ожидал от bash, в crontab ничего не происходит. Он даже не пишет никаких ошибок в файл. Запуск ps aux | grep rsync ничего интересного не показывает. Я не могу найти проблему. Есть идеи?

ОБНОВЛЕНИЕ: Благодаря ответам, которые я получил, я смог настроить команду так, чтобы она работала должным образом, хотя никто из них не решил проблему самостоятельно. Вот что я нашел работы этим утром:

0 * * * * /usr/bin/rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" 
user@host:/path/to/dir/ user@host:/path/to/another/dir/ /destination/dir
--exclude='.DS_Store' > /var/log/backup/_hourlybackup.log 2>&1   

По какой-то причине причиной является проблема date '+%Y_%m_%d_%H:%M' (заключенная в обратные черты). Если я уберу это из команды, все будет работать нормально ... хотя для меня важно, чтобы у меня были полные журналы резервного копирования, поэтому я все же хотел бы найти решение этой проблемы. Я буду продолжать хакаться, но если кто-нибудь знает, будь моим гостем.

5 ответов5

1

Проблема, как я уже упоминал в обновлении, связана с командой date . Оказывается, если вы пишете команду непосредственно в crontab , а не в сценарий оболочки, вам нужно экранировать % в строке опции date . Вот что получилось:

0 * * * * rsync -av --delete user@host:/path/to/dir 
user@host:/path/to/another/dir /path/to/destination
--exclude='.DS_Store' >
/var/log/backup/`date '+\%Y_\%m_\%d_\%H'`h_hourlybackup.log 2>&1

Спасибо всем, кто помог мне понять это. Эта команда, вероятно, станет более длинной и более сложной в будущем и, таким образом, будет лучше подходить к собственному сценарию оболочки, но сейчас, я думаю, все в порядке непосредственно в crontab .

0

поместите вашу команду rsync в скрипт .sh (shell), чтобы запустить ее с помощью crontab

  • поиск по сценарию оболочки, как этот пример

    test.sh

#!/ Бен / ш

echo $2 echo $1
  • в вашем скрипте используйте этот синтаксис для имени вашего файла резервной копии

сейчас = $(дата +"% m_% d_% Y")

.. &> /var/log/backup/{$now}_hourlybackup.log
0

Просто прокомментировал бы проверенный ответ, но новый и пока не может комментировать.

Я просто хотел объяснить, почему вы видели эту проблему. % означает новую строку, и любой текст после первого передается команде как stdin.

Итак, ваша команда cron:

rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" user@host:/path/to/dir/ \
  user@host:/path/to/another/dir/ /destination/dir --exclude='.DS_Store' \
  &> /var/log/backup/`date '+%Y_%m_%d_%H:%M'`_hourlybackup.log

интерпретируется как:

rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" user@host:/path/to/dir/ \
  user@host:/path/to/another/dir/ /destination/dir --exclude='.DS_Store' \
  &> /var/log/backup/`date '+<<EOI
Y_
m_
d_
H:
M'`_hourlybackup.log
EOI

Когда оболочка пытается выполнить ее, она не может найти второй `, поскольку она теперь присутствует как часть стандартного ввода команды. Ключ должен понять, что все символы% должны быть экранированы, если вы действительно не хотите переводить строки.

0

В большинстве случаев это происходит потому, что вы не указали полный путь к вашему rsync например

/usr/bin/rsync -av ...

Также вы можете попытаться создать небольшой скрипт оболочки и поместить эту команду туда и просто выполнить этот единственный скрипт из вашего cron

0

Это может быть проблемой пути, но маловероятно, поскольку root должен иметь путь /usr/bin .

Однако команды crontab, скорее всего, запускаются не с Bash, а с Dash. Конструкция &> является "Bashism" [ 1 ] [ 2 ].

замещать

command >& file

с

command > file 2>&1

чтобы заставить его работать как задумано в Dash.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .