Это связано с тем, как вы используете inotifywatch
, и как работает сам инструмент. Когда вы запускаете inotifywatch -r /tmp
, вы начинаете смотреть /tmp
и все файлы, которые уже есть в нем. Когда вы создаете файл внутри /tmp
, метаданные каталога обновляются, чтобы содержать номер индекса нового файла, что означает, что изменение происходит /tmp
, а не /tmp/test-1
. Кроме того, так /tmp/test-1
как не было там, когда inotifywatch
началось, на нем нет inotify
часов. Это означает, что любое событие, которое происходит с файлом, созданным после помещения часов, не будет обнаружено . Возможно, вы поймете это лучше, если увидите это сами:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Если вы включили механизм трассировкиinotify_add_watch(2)
, последняя команда выдаст вам количество часов, установленных inotifywatch
. Это число должно быть таким же, как и inotifywatch
само по себе. Теперь создайте файл внутри /tmp
и проверьте снова:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Число не увеличится, что означает, что новый файл не просматривается. Обратите внимание, что поведение будет другим, если вместо этого вы создадите каталог:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Это связано с тем, как -r
коммутатор ведет себя :
-r
, --recursive
: [...] Если в наблюдаемых каталогах создаются новые каталоги, они будут автоматически отслеживаться.
Edit: я немного запутался между вашими двумя примерами, но в первом случае , часы правильно размещены , так как вызовы пользователя inotifywatch
на ~/*
(который раскладывается, см комментарий don_crissti здесь ). Домашний каталог также отслеживается, потому что ~/.*
содержит ~/.
. Теоретически, он также должен содержать ~/..
, что в сочетании с -r
переключателем должно привести к просмотру всей системы.
Тем не менее, это возможно , чтобы получить имя файла , запускающий создать событие в наблюдаемом каталоге, но я предполагаю , inotifywatch
не получить эту информацию (он сохраняется немного глубже , чем имя каталога). inotify-tools
предоставляет другой инструмент под названием inotifywait
, который может вести себя примерно так же inotify-watch
, и предоставляет больше опций вывода (включая то %f
, что вы ищете здесь):
inotifywait -m --format "%e %f" /tmp
Со страницы руководства :
--format <fmt>
Вывод в указанном пользователем формате с использованием printf-подобного синтаксиса. [...] Поддерживаются следующие преобразования:
%f
: когда событие происходит в каталоге, оно будет заменено именем файла, вызвавшего событие .
%e
: заменяется событием (ями), которые произошли, через запятую.
Кроме того, -m
опция (монитор) будет продолжать inotifywait
работать после первого события, которое будет воспроизводить поведение, очень похожее на inotifywatch
«s».
.bashrc
в примере @serverfault
не появляется в статистике, потому что пользователь рекурсивно контролирует свой домашний каталог, а потому чтоpath/.*
расширяется, и в результате для всех .files вpath/
(.bashrc
включенных) устанавливается наблюдение . Команда, используемая OP, никогда не будет выводить имена файлов, поскольку для них установлены часы/tmp
и любые подкаталоги, поэтому статистика будет относиться только к/tmp
подкаталогам и их подкаталогам (т. Е. Вы увидите, что к файлам обращались / перемещали / и т. Д., Но не сообщали вам их имена).