Назад | Перейти на главную страницу

Необходимо проверять дерево каталогов на наличие изменений каждые 10 секунд и запускать скрипт, если он изменился.

У меня есть каталог, в котором есть много папок с кодом внутри, и мне нужно запустить сценарий, чтобы rsync переключился на пару других серверов. У меня этот сценарий написан и работает нормально, но я не могу найти что-нибудь, что проверяет дерево каталогов на наличие изменений. Я пробовал stat, но проверял только одну папку, а не рекурсивно (насколько я мог понять). Кто-нибудь знает команду или программу, которую я мог бы установить для этого? Я использую Ubuntu 10.04. Заранее спасибо.

Идеальный инструмент для этой работы - использование службы ядра inotify. Вы можете использовать их в сценарии оболочки с пакетом inotify-tools (debian / ubuntu). Вы можете прочитать больше и увидеть некоторые примеры на страница проекта. На странице даже есть пример, который, кажется, делает что-то близкое к тому, что вы хотите:

#!/bin/sh

# get the current path
CURPATH=`pwd`

inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' \
-e close_write /tmp/test | while read date time dir file; do

       FILECHANGE=${dir}${file}
       # convert absolute path to relative
       FILECHANGEREL=`echo "$FILECHANGE" | sed 's_'$CURPATH'/__'`

       rsync --progress --relative -vrae 'ssh -p 22'  $FILECHANGEREL usernam@example.com:/backup/root/dir && \
       echo "At ${time} on ${date}, file $FILECHANGE was backed up via rsync"
done

inotifywait будет выполнять рекурсивные проверки.

Это в Репозитории Ubuntu.

rsync проверит дерево каталогов на наличие изменений и скопирует только измененные файлы, если вы укажете каталог в качестве источника.

Посмотри на inotify. Некоторое время назад я решил аналогичную проблему с помощью dnotify или sgi_fam (не помню, какие именно), но inotify, похоже, заменил их обоих.

Кто-то уже изобрел это колесо. Это называется lsyncd и, по-видимому, это смесь rsync и inotify. Я сам не использовал его, потому что ограничения inotify таковы, что он не масштабируется до действительно больших (и глубоких) каталогов. Я жду, пока они его не реализуют напрямую, используя fsnotify.

Есть также PIrsyncD который, кажется, делает то же самое.

использовать найти

find /path -mmin 1

Это проверит, был ли файл или каталог изменен 1 минуту назад, посмотрите страницу руководства для получения дополнительных опций.