如何使用 dnotify /inotify 命令持续监控目录

新手上路,请多包涵

我是 dnotify/inotify 命令的新手。任何人都可以帮助我如何编写一个脚本,以便它持续监视一个目录并指示它有一些更改或修改。

原文由 sai sindhu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 563
2 个回答

Inotify 本身是一个内核模块,可通过来自例如 C 程序的调用访问。

https://linux.die.net/man/7/inotify

有一个名为 inotify-tools 的应用程序套件,其中包含:

inotifywait - 使用 inotify 等待对文件的更改

http://linux.die.net/man/1/inotifywait

inotifywatch - 使用 inotify 收集文件系统访问统计信息

http://linux.die.net/man/1/inotifywatch

您可以直接从命令行使用 inotify,例如像这样持续监控主目录下的所有更改(可能会生成大量输出):

 inotifywait -r -m $HOME

这是一个持续监控并响应 Apache 日志活动的脚本,从 inotifywait 的 man 文件中复制:

 #!/bin/sh
while inotifywait -e modify /var/log/messages; do
  if tail -n1 /var/log/messages | grep httpd; then
    kdialog --msgbox "Apache needs love!"
  fi
done

原文由 thnee 发布,翻译遵循 CC BY-SA 4.0 许可协议

下面是我用来查看对单个文件的操作的内容。 “-m”仅在一个事件后导致监视与退出。要获取时间戳,您至少需要 3.13 版本的 inotify-tools,但如果这不重要(或在您的操作系统上不可用或难以更新),您可以跳过 timefmt 和格式选项。另一个 shell 中的“cat /etc/resolv.conf”会导致以下结果:

 $ inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' /etc/resolv.conf

Setting up watches.
Watches established.
12:49 /etc/resolv.conf OPEN
12:49 /etc/resolv.conf ACCESS
12:49 /etc/resolv.conf CLOSE_NOWRITE,CLOSE

inotifywait 也有监视目录的选项,因此请查看手册页。添加 -r 进行递归以监视目录的子项。

这是我在另一个窗口中键入的命令的示例,该窗口显示为“->”前缀:

 $ inotifywait -mr --timefmt '%H:%M' --format '%T %w %e %f' /home/acarwile/tmpdir
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

-> cd into directory, no info
-> ls in directory
13:15 /home/acarwile/tmpdir/ OPEN,ISDIR
13:15 /home/acarwile/tmpdir/ CLOSE_NOWRITE,CLOSE,ISDIR

-> touch newfile
13:16 /home/acarwile/tmpdir/ CREATE newfile
13:16 /home/acarwile/tmpdir/ OPEN newfile
13:16 /home/acarwile/tmpdir/ ATTRIB newfile
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE newfile

-> mv newfile renamedfile
13:16 /home/acarwile/tmpdir/ MOVED_FROM newfile
13:16 /home/acarwile/tmpdir/ MOVED_TO renamedfile

-> echo hello >renamedfile
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile
13:16 /home/acarwile/tmpdir/ OPEN renamedfile
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile

-> touch renamedfile
13:17 /home/acarwile/tmpdir/ OPEN renamedfile
13:17 /home/acarwile/tmpdir/ ATTRIB renamedfile
13:17 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile

-> rm renamedfile
13:17 /home/acarwile/tmpdir/ DELETE renamedfile

-> cd ..; rmdir tmpdir
13:17 /home/acarwile/tmpdir/ DELETE_SELF

在上述之后,我尝试重新制作 tmpdir(“mkdir tmpdir”),但没有得到任何输出。新的 tmpdir 与旧的 tmpdir 不是同一个目录。是时候 ^C 并停止它通知等待了。

原文由 Alan Carwile 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏