Я пытаюсь использовать rsync только для синхронизации файлов, которые были изменены или созданы с момента последнего запуска. Это попытка не дать дискам моих NAS-серверов раскручиваться каждый раз при запуске rsync, даже если нет файла для копирования.
Я предполагаю, что самый простой способ установить время последнего запуска - прикоснуться к файлу маркера. Я могу это сделать. Где я застрял, так это то, что rsync синхронизирует только файлы новее, чем файл маркера. Я не думаю, что у rsync есть опция -newer. Я предполагаю, что мне может понадобиться запустить некоторые другие команды, которые создадут список включения, но я настоящий * nix noob.
Если это важно, сценарии будут выполняться в unRAID-версии Slackware.
В этой части ваши вопросы кажутся ошибочными:
«Это попытка не дать дискам моих NAS-серверов раскручиваться каждый раз при запуске rsync, даже если нет файла для копирования».
Если диски не раскручиваются, как вы собираетесь проверять наличие более новых версий файлов, хранящихся на них? rsync
будет синхронизировать только файлы, которые являются более новыми или были изменены в источнике (если не используется параметр не по умолчанию, например -c, --checksum skip based on checksum, not mod-time & size
.
Если вы не хотите раскручивать диски, вы можете, как вы говорите, использовать файл маркера на другом диске, который, я полагаю, всегда вращается. Итак, вы можете написать простой сценарий bash, который объединяет все вместе, но для меня это звучит как неправильный подход.
Ваше решение - начать rsync
только если нужно запустить. Напишите скрипт, который проверяет, есть ли в источнике более новые файлы, и если они есть, запустите rsync
.
Супер-простой пример скрипта для cron
Предполагая, что задание cron выполняется каждые 60 минут с локальным подключением как источника, так и цели, адаптируйте его соответствующим образом (включая путь к find
и rsync
(используйте which find
и which rsync
чтобы получить это):
#!/bin/bash
FIND=/usr/bin/find
RSYNC=/usr/bin/rsync
SOURCE=/sourcedir
TARGET=/targetdir
INTERVAL=60
FILELIST=/tmp/filelist.$(date +%s)
cd $SOURCE
$FIND . -type f -mmin -$INTERVAL > $FILELIST
cat $FILELIST
if [ $(cat $FILELIST | wc -l) -ne "0" ]
then
$RSYNC -av --files-from=$FILELIST $SOURCE/ $TARGET/
fi
rm -f $FILELIST
попробуйте использовать rsync с параметром -u, синхронизировать только файлы, которые были изменены. По-прежнему вызывает вращение диска, однако сокращает фактическое время выполнения.
Вместо этого вы должны использовать lsyncd или даже inotifywait + scp, но это немного больше скриптов.
lsyncd использует inotify для определения наличия новых / измененных файлов, затем используйте rsync + ssh для передачи файлов.
Если lsyncd слишком сложен, вы можете использовать inotifywait, например:
while read line
do
echo "$line"
done < <(inotifywait -mr "/dir/to/monitor/")
(вам нужно будет изменить часть эха на scp)
Если вы используете rsync, вы можете ограничить, какие файлы rsync должен проверять с помощью команды find, например:
cd /source/dir/
rsync -ravhz --files-from=<(find . -mtime -1) ./ /target/dir/
Приведенный выше rsync не должен проверять файлы с измененным / созданным временем старше одного дня.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не тестировал вышеуказанное! Пожалуйста, будь осторожен!!!