Это сценарий, который я использую:
find /path/backups/ -type f -mtime -2 -printf '%P\n' | rsync -avz --progress --delete --exclude-from=- -e "ssh -p 512" /path/backups/ me@host:/remote/path/server-backups/
Это из журнала:
> Jan 21 15:32:01 servername CRON[14654]: (serveruser) CMD (find /path/backups/ -type f -mtime -2 -printf ')
Я пробовал использовать cron.d
, crontab -e
и cron.daily
. Оба помещают сценарий непосредственно в файл crontab
, а также вызывают файл сценария .sh
. Есть идеи, как я могу это решить?
Команда усекается, потому что %
имеет особое значение в cron
. Из man 5 crontab
:
The ``sixth'' field (the rest of the line) specifies the command to be
run. The entire command portion of the line, up to a newline or %
character, will be executed by /bin/sh or by the shell specified in the
SHELL variable of the crontab file. Percent-signs (%) in the command,
unless escaped with backslash (\), will be changed into newline charac‐
ters, and all data after the first % will be sent to the command as
standard input. There is no way to split a single command line onto
multiple lines, like the shell's trailing "\".
, в котором объясняется, почему зарегистрированная команда выглядит примерно так:
CMD (find /home/steeldriver/forums/tests -type f -mtime +1 -printf ')
Чтобы продемонстрировать, что экранирование работает, дается:
$ ls -l tests
total 12
-rw-rw-r-- 1 steeldriver steeldriver 0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 22 Oct 27 22:18 A9E27.txt
-rw-rw-r-- 1 steeldriver steeldriver 10 Oct 27 22:19 ffn2eG6.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt
Затем добавляем crontab как:
* * * * * find /home/steeldriver/forums/tests -type f -mtime +1 -printf '\%P\0' | rsync -0av --exclude-from=- /home/steeldriver/forums/tests/ /home/steeldriver/forums/newtests/ 2>&1 > /home/steeldriver/forums/backup.log
(обратите внимание на это использует форму с завершающим нулем \ 0
) создает файл журнала:
$ cat backup.log
sending incremental file list
created directory /home/steeldriver/forums/newtests
./
A8eVAmK.txt
sBHFgkv.txt
sent 250 bytes received 113 bytes 726.00 bytes/sec
total size is 43 speedup is 0.12
, указывающий, что резервное копирование выполнено успешно и скопированы только новые файлы:
$ ls -l newtests
total 4
-rw-rw-r-- 1 steeldriver steeldriver 0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt
Обратите внимание, что вы не сможете проверить экранирование вне вашего crontab - в терминале это приведет к ошибке из find
.
Я предлагаю альтернативный подход. Использование временных файлов может облегчить вашу жизнь и поможет избежать использования каналов, которые могут вызвать проблемы с заданиями cron.
Процесс здесь довольно прост. Сначала введите команду
find ./ -daystart -mtime +2> myfile
Примечание:
Вышеупомянутое будет соответствовать файлам возрастом от 2 до 3 дней, поскольку в нем используются целые дни. * При необходимости измените или используйте -mmin и минуты для более точного выбора. Результаты сопоставления будут записаны в файл myfile, который будет: перезаписывается каждый раз при запуске команды.
Затем введите команду:
sed 's | ./ ||' myfile> EXCL_list
, чтобы удалить ненужный префикс. Файл EXCL_list будет перезаписываться каждый раз при запуске команды.
Наконец, введите команду:
rsync -Pav --exclude-from = EXCL_list --delete-excluded source / dest
Объяснение переключателей rsync :
-P
то же, что --partial --progress
-a
режим архивирования
-v
подробный
- exclude-from = EXCL_list
читать исключить шаблоны из ФАЙЛА
- удалить-исключить
также удалить исключенных файлов из директорий dest
для получения более подробной информации и дополнительных опций см. man rsync
Допущения:
Команды запускаются в исходном каталоге, содержащем файлы и папки, которые вы хотите обработать.
dest в команде rsync - это смонтированный пункт назначения, в который у вас есть разрешение на запись.
Надеюсь, это поможет.
Источники:
http://www.linuxquestions.org/questions/linux-general-1/rsync-only-60-day-old-files-580357
https://serverfault.com/questions/279609/what-exactly-will-delete-excluded-do-for-rsync
человек найти
man rsync