inotifywatch: продолжить наблюдение после ротации файлов

Что я делаю для такого рода вещей, так это меняю значение PS1 , когда я меняю каталоги. Это тривиально в zsh, который выполняет команду chpwd ; это можно сделать в bash, определив оболочки для cd и друзей .

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  if git rev-parse --show-toplevel 2>/dev/null >/dev/null; then
    PS1='$ \w $(__git_ps1): '
  else
    PS1='$ \w: '
  fi
}

3
18.12.2016, 11:04
2 ответа

Это можно сделать с помощью inotifywait с однострочным текстом:

inotifywait -e move_self -e modify -m /path/to/some/file | awk '$2=="MODIFY" {system("/bin/echo Yes")}'

Флаг -m сохраняет мониторинг файла на неопределенный срок, для событий move_self (что позволяет отслеживать изменение имени файла или каталога) и modify , передавая вывод в команду awk который отсеивает события move_self , выполняя команду внутри набора скобок системы для каждого события модификации . Вам придется написать свой собственный сценарий оболочки вместо моей команды echo . Обратите внимание на различные наборы апострофов и кавычек.

2
27.01.2020, 21:12

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

AFAIK, tail -f использует система inotify, так что это не поможет.Но если у вас есть рабочее решение с tail -f , используйте tail --follow = name (или tail -F ), если это поддерживается вашей версией. of tail (POSIX tail не поддерживает это). tail затем будет отслеживать файл, идентифицированный его именем файла. Вот отрывок из справочной страницы:

С --follow (-f) хвост по умолчанию следует за файловым дескриптором, что означает, что даже если хвостовой файл переименован, хвост будет - продолжить, чтобы отследить его конец. Такое поведение по умолчанию нежелательно, если вы действительно хотите, чтобы отслеживал фактическое имя файла, а не дескриптор файла (например, ротацию журнала). В этом случае используйте --follow = name. Это заставляет tail отслеживать именованный файл таким образом, чтобы его можно было переименовать, удалить и создать.

[update]

Пример использования:

tail -n0 -F my_file.log \
| while read -r log_line; do
    do_something_with "$log_line"
done

Из-за конвейера цикл while выполняется в под- процесс, который может вызвать проблемы, если вы захотите изменить переменные вне цикла. Если вы используете bash , вы можете использовать этот альтернативный синтаксис, который не имеет этого нежелательного эффекта (но менее читабелен):

while read -r log_line; do
    do_something_with "$log_line"
done < <(tail -n0 -F my_file.log)
6
27.01.2020, 21:12

Теги

Похожие вопросы