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

时间:2021-08-05 16:59:21

I am new to dnotify/inotify command. Can any one help me how to write a script such that it continuously monitors a directory and indicates that there is some change or modification to it.

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

3 个解决方案

#1


26  

Inotify itself is a kernel module accesible via calls from e.g. a C program. http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/

Inotify本身是一个内核模块,可以通过例如来自例如一个C程序。 http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/

There is an application suite called inotify-tools, which contains:

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

inotifywait - wait for changes to files using inotify

inotifywait - 等待使用inotify更改文件

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

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

and

inotifywatch - gather filesystem access statistics using inotify

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

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

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

You can use inotify directly from command line, e.g. like this to continuously monitor for all changes under home directory (may generate lots of output):

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

inotifywait -r -m $HOME

And here is a script that monitors continuously and reacts to Apache log activity, copied from the man file of inotifywait:

这里有一个脚本,可以持续监视并响应来自inotifywait的man文件的Apache日志活动:

#!/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

#2


11  

Below is what I use to see operations on an individual file. "-m" causes monitoring vs. exit after just one event. To get timestamps, you need at least 3.13 version of inotify-tools, but if that is not important (or not available on your OS or hard to update to) you can skip the timefmt and format options. "cat /etc/resolv.conf" in another shell leads to the results below:

下面是我用来查看单个文件的操作。 “-m”仅在一个事件后导致监视与退出。要获取时间戳,您至少需要3.13版本的inotify-tools,但如果这不重要(或者在您的操作系统上不可用或难以更新),您可以跳过timefmt和format选项。另一个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 has options for monitoring directories as well, so check the manpage. Add -r for recursive to monitor children of a dir.

inotifywait也有监视目录的选项,因此请查看联机帮助页。添加-r用于递归以监视目录的子项。

Here's an example with the commands I typed in a different window shown with "->" prefix:

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

$ 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 

After the above, I tried to remake the tmpdir ("mkdir tmpdir") but got no output from that. The new tmpdir is not the same directory as the old tmpdir. Time to just ^C and stop itnotifywait.

在上面之后,我试图重新制作tmpdir(“mkdir tmpdir”),但没有输出。新的tmpdir与旧的tmpdir不是同一个目录。时间到^ C并停止itnotifywait。

#3


4  

As I said on https://superuser.com/a/747574/28782, I made a helper script that uses inotifywait without some of its direct limitations: inotifyexec

正如我在https://superuser.com/a/747574/28782上所说,我创建了一个使用inotifywait的帮助程序脚本,没有一些直接的限制:inotifyexec

Usage example (supposing you've added it in your system path as executable):

用法示例(假设您已将其作为可执行文件添加到系统路径中):

inotifyexec "echo test" -r .

#1


26  

Inotify itself is a kernel module accesible via calls from e.g. a C program. http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/

Inotify本身是一个内核模块,可以通过例如来自例如一个C程序。 http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/

There is an application suite called inotify-tools, which contains:

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

inotifywait - wait for changes to files using inotify

inotifywait - 等待使用inotify更改文件

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

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

and

inotifywatch - gather filesystem access statistics using inotify

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

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

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

You can use inotify directly from command line, e.g. like this to continuously monitor for all changes under home directory (may generate lots of output):

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

inotifywait -r -m $HOME

And here is a script that monitors continuously and reacts to Apache log activity, copied from the man file of inotifywait:

这里有一个脚本,可以持续监视并响应来自inotifywait的man文件的Apache日志活动:

#!/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

#2


11  

Below is what I use to see operations on an individual file. "-m" causes monitoring vs. exit after just one event. To get timestamps, you need at least 3.13 version of inotify-tools, but if that is not important (or not available on your OS or hard to update to) you can skip the timefmt and format options. "cat /etc/resolv.conf" in another shell leads to the results below:

下面是我用来查看单个文件的操作。 “-m”仅在一个事件后导致监视与退出。要获取时间戳,您至少需要3.13版本的inotify-tools,但如果这不重要(或者在您的操作系统上不可用或难以更新),您可以跳过timefmt和format选项。另一个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 has options for monitoring directories as well, so check the manpage. Add -r for recursive to monitor children of a dir.

inotifywait也有监视目录的选项,因此请查看联机帮助页。添加-r用于递归以监视目录的子项。

Here's an example with the commands I typed in a different window shown with "->" prefix:

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

$ 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 

After the above, I tried to remake the tmpdir ("mkdir tmpdir") but got no output from that. The new tmpdir is not the same directory as the old tmpdir. Time to just ^C and stop itnotifywait.

在上面之后,我试图重新制作tmpdir(“mkdir tmpdir”),但没有输出。新的tmpdir与旧的tmpdir不是同一个目录。时间到^ C并停止itnotifywait。

#3


4  

As I said on https://superuser.com/a/747574/28782, I made a helper script that uses inotifywait without some of its direct limitations: inotifyexec

正如我在https://superuser.com/a/747574/28782上所说,我创建了一个使用inotifywait的帮助程序脚本,没有一些直接的限制:inotifyexec

Usage example (supposing you've added it in your system path as executable):

用法示例(假设您已将其作为可执行文件添加到系统路径中):

inotifyexec "echo test" -r .