Подавить или предотвратить повторяющиеся события inotifywait?

В настоящее время inotifywait смотрит папки git сервера. Конец он излучает только когда конкретный файл изменен. Проблема в том, что когда изменения передаются на сервер git, inotifywait срабатывает несколько раз. Я не знаю почему.

Итак, как я могу сделать следующее: предотвратить inotifywait делать дубликаты?

Я думал об алгоритме: при первом запуске -> сценарий сна, чтобы он не сканировал следующие изменения в течение 5 секунд -> сценарий возобновления. Но это звучит идиотски... Можете ли вы помочь мне достичь этого? Спасибо!!

2 ответа

Вот как я решил это для своих нужд. Я отслеживаю путь, чтобы он автоматически компилировался при синтаксических ошибках. И мне надоели повторяющиеся события, испускаемые inotifywait, Добавить syncheck функция в вашем .bashrc:

syncheck() {
  declare -A fileMap
  inotifywait --exclude .swp --format '%w%f' -e modify,create -m -r -q $* | \
  while read FILE; do
    es=$(date +'%s')
    case "$FILE" in
    *.hs)
    if [[ ${fileMap[$FILE]} != $es ]];then
        sdiff=$((es-${fileMap[$FILE]:-0}))
        fileMap[$FILE]=$es
        ((sdiff < 3)) && continue
        ghc -fno-code $FILE
        echo "---------------------------------------------"
    fi
    ;;
    esac
  done
}

Как пользоваться:

cd ~/src/proj/
. ~/.bashrc
syncheck .

В другом терминале измените или создайте Haskell файл в ~/src/proj/ место нахождения. syncheck цикл while обнаружит это и автоматически скомпилирует на наличие синтаксических ошибок.

Ключевой идеей этого решения по подавлению дубликатов событий является секунда эпохи Unix и словарь bash.

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

Вы можете не только проверить свои inotify функция при мониторинге тех файлов, измененных при оформлении заказа, но вы можете даже не использовать inotify на всех, и с помощью ловушки, чтобы вызвать ваше уведомление.
post-receive Hook может перечислить файлы, и вы можете запустить свое уведомление только для определенных файлов.

Другие вопросы по тегам