侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux inotifywait命令教程:如何实时监控文件系统事件(附实例详解和注意事项)

Linux inotifywait命令介绍

inotifywait是一个用于监控文件系统事件的命令,它基于Linux内核的inotify机制,可以实时地检测文件或目录的变化,如创建、删除、修改、移动、访问等,并将事件输出到标准输出或执行指定的命令。inotifywait可以用于实现各种自动化的任务,如备份、同步、编译、测试等。

Linux inotifywait命令适用的Linux版本

inotifywait命令需要Linux内核版本2.6.13或更高,以及inotify-tools包的安装。不同的Linux发行版可能有不同的安装方法,以下是一些常见的例子:

  • Ubuntu/Debian: sudo apt-get install inotify-tools
  • CentOS/RHEL: sudo yum install inotify-tools (CentOS 7) 或 sudo dnf install inotify-tools (CentOS 8)
  • Fedora: sudo dnf install inotify-tools
  • Arch Linux: sudo pacman -S inotify-tools

如果你的Linux发行版没有提供inotify-tools包,你也可以从源码编译安装,具体步骤请参考官方文档

Linux inotifywait命令的基本语法

inotifywait命令的基本语法格式如下:

inotifywait [options] file|directory...

其中,file|directory...表示要监控的文件或目录,可以是一个或多个,如果是目录,可以使用-r选项递归地监控其子目录。options表示一些可选的参数,用于控制inotifywait的行为,如事件类型、输出格式、超时时间、退出条件等。下面将介绍一些常用的选项或参数。

Linux inotifywait命令的常用选项或参数说明

inotifywait命令有很多选项或参数,可以通过man inotifywaitinotifywait --help查看完整的列表。这里只列举一些最常用的,如果选项比较多,可以使用表格形式,如下:

选项参数说明
-r递归地监控目录及其子目录
-m监控模式,持续地输出事件,直到按Ctrl+C或达到退出条件
-q安静模式,不输出统计信息或警告信息
-eevent,...指定要监控的事件类型,多个事件用逗号分隔,如果不指定,则监控所有事件
-ofile将事件输出到指定的文件,而不是标准输出
-ccommand当检测到事件时,执行指定的命令,命令中可以使用一些预定义的变量,如@表示事件的完整输出,#表示事件的数量,%表示事件的名称,&表示事件的路径
-tseconds设置超时时间,如果在指定的秒数内没有检测到任何事件,inotifywait将退出
--excludepattern排除匹配指定正则表达式的文件或目录
--excludeipattern排除匹配指定正则表达式的文件或目录,忽略大小写
--formatformat指定事件输出的格式,可以使用一些预定义的变量,如%e表示事件的名称,%f表示事件的文件名,%w表示事件的路径,%T表示事件的时间戳
--timefmtformat指定事件输出的时间戳格式,可以使用strftime函数的格式字符串,如%Y-%m-%d %H:%M:%S表示年-月-日 时:分:秒
--fromfilefile从指定的文件中读取要监控的文件或目录,每行一个
--monitor监控模式的别名,等同于-m
--quiet安静模式的别名,等同于-q
--eventevent,...事件类型的别名,等同于-e
--outfilefile输出文件的别名,等同于-o
--timeoutseconds超时时间的别名,等同于-t
--recursive递归监控的别名,等同于-r
--help显示帮助信息
--version显示版本信息

Linux inotifywait命令的实例

实例1:监控当前目录的所有事件

如果不指定任何选项和参数,inotifywait命令将监控当前目录的所有事件,并在检测到事件后退出。例如:

[linux@bashcommandnotfound.cn ~]$ inotifywait .
Setting up watches.
Watches established.
./ MODIFY test.txt

上面的命令表示监控当前目录(.)的所有事件,当修改了test.txt文件后,输出了事件的路径(./)、事件的名称(MODIFY)和事件的文件名(test.txt),然后退出。

实例2:监控指定目录的所有事件

如果指定一个或多个目录作为参数,inotifywait命令将监控这些目录的所有事件,并在检测到事件后退出。例如:

[linux@bashcommandnotfound.cn ~]$ inotifywait /home /etc
Setting up watches.
Watches established.
/home/ CREATE test

上面的命令表示监控/home和/etc两个目录的所有事件,当在/home目录下创建了test文件或目录后,输出了事件的路径(/home/)、事件的名称(CREATE)和事件的文件名(test),然后退出。

实例3:监控指定文件的所有事件

如果指定一个或多个文件作为参数,inotifywait命令将监控这些文件的所有事件,并在检测到事件后退出。例如:

[linux@bashcommandnotfound.cn ~]$ inotifywait /etc/passwd /etc/group
Setting up watches.
Watches established.
/etc/group MODIFY

上面的命令表示监控/etc/passwd和/etc/group两个文件的所有事件,当修改了/etc/group文件后,输出了事件的路径(/etc/group)、事件的名称(MODIFY),然后退出。

实例4:监控指定事件类型

[linux@bashcommandnotfound.cn ~]$ inotifywait -e create,delete /home
Setting up watches.
Watches established.
/home/ CREATE test

上面的命令表示只监控/home目录的创建和删除事件,当在/home目录下创建了test文件或目录后,输出了事件的路径(/home/)、事件的名称(CREATE)和事件的文件名(test),然后退出。

实例5:监控目录及其子目录的所有事件

如果使用-r选项,inotifywait命令将递归地监控目录及其子目录的所有事件,并在检测到事件后退出。例如:

[linux@bashcommandnotfound.cn ~]$ inotifywait -r /home
Setting up watches.
Watches established.
/home/test/ MODIFY test.txt

上面的命令表示监控/home目录及其子目录的所有事件,当在/home/test目录下修改了test.txt文件后,输出了事件的路径(/home/test/)、事件的名称(MODIFY)和事件的文件名(test.txt),然后退出。

实例6:持续地监控事件并输出到文件

如果使用-m选项,inotifywait命令将持续地监控事件,并将事件输出到标准输出或指定的文件,直到按Ctrl+C或达到退出条件。例如:

[linux@bashcommandnotfound.cn ~]$ inotifywait -m -o log.txt /home
Setting up watches.
Watches established.

上面的命令表示持续地监控/home目录的所有事件,并将事件输出到log.txt文件,不输出到标准输出。如果查看log.txt文件的内容,可以看到类似如下的输出:

[linux@bashcommandnotfound.cn ~]$ cat log.txt
/home/ CREATE test
/home/test/ CREATE test.txt
/home/test/ MODIFY test.txt
/home/test/ DELETE test.txt
/home/ DELETE test

上面的输出表示在/home目录下创建了test文件或目录,然后在/home/test目录下创建了test.txt文件,接着修改了test.txt文件,然后删除了test.txt文件,最后删除了test文件或目录。

实例7:在检测到事件时,执行备份命令

[linux@bashcommandnotfound.cn ~]$ inotifywait -m -e modify /home/test -c 'cp /home/test/$& /home/backup/$&'
Setting up watches.
Watches established.

上面的命令表示持续地监控/home/test目录的修改事件,并在检测到事件时,执行cp命令,将修改的文件复制到/home/backup目录下,其中$&表示事件的文件名。如果在/home/test目录下修改了test.txt文件,那么/home/backup目录下也会有一个test.txt文件,内容和/home/test目录下的一致。

实例8:在检测到事件时,执行同步命令

[linux@bashcommandnotfound.cn ~]$ inotifywait -m -e create,delete,move /home/test -c 'rsync -avz /home/test/ user@remote:/home/test/'
Setting up watches.
Watches established.

上面的命令表示持续地监控/home/test目录的创建、删除和移动事件,并在检测到事件时,执行rsync命令,将/home/test目录下的内容同步到远程服务器的/home/test目录下,其中user@remote表示远程服务器的用户名和地址,需要提前配置好SSH免密登录。

实例9:在检测到事件时,执行编译命令

[linux@bashcommandnotfound.cn ~]$ inotifywait -m -e close_write /home/test -c 'gcc /home/test/$& -o /home/test/${&%.*}'
Setting up watches.
Watches established.

上面的命令表示持续地监控/home/test目录的关闭写入事件,并在检测到事件时,执行gcc命令,将关闭写入的文件编译成可执行文件,其中&表示事件的文件名,{&%.*}表示去掉文件名的扩展名。如果在/home/test目录下写入了test.c文件,那么/home/test目录下也会生成一个test可执行文件。

实例10:指定事件输出的格式和时间戳格式

如果使用--format选项,inotifywait命令可以指定事件输出的格式,可以使用一些预定义的变量,如%e表示事件的名称,%f表示事件的文件名,%w表示事件的路径,%T表示事件的时间戳。如果使用--timefmt选项,inotifywait命令可以指定事件输出的时间戳格式,可以使用strftime函数的格式字符串,如%Y-%m-%d %H:%M:%S表示年-月-日 时:分:秒。例如:

[linux@bashcommandnotfound.cn ~]$ inotifywait -m --format '%T %w %f %e' --timefmt '%Y-%m-%d %H:%M:%S' /home/test
Setting up watches.
Watches established.
2023-12-26 15:03:00 /home/test/ test.txt CREATE
2023-12-26 15:03:01 /home/test/ test.txt MODIFY
2023-12-26 15:03:02 /home/test/ test.txt DELETE

上面的命令表示持续地监控/home/test目录的所有事件,并将事件输出的格式指定为时间戳、路径、文件名和事件名称,用空格分隔,并将时间戳的格式指定为年-月-日 时:分:秒。如果在/home/test目录下创建、修改和删除了test.txt文件,那么输出的格式如上所示。

Linux inotifywait命令的注意事项

  • 如果使用--exclude或--excludei选项,inotifywait命令可以排除匹配指定正则表达式的文件或目录,这样可以减少不必要的事件通知。例如:
[linux@bashcommandnotfound.cn ~]$ inotifywait -m -r --exclude '.*\.swp' /home/test
Setting up watches.
Watches established.

上面的命令表示持续地监控/home/test目录及其子目录的所有事件,但排除了以.swp结尾的文件,这样可以避免vim编辑器产生的临时文件的事件。

  • 如果使用-t选项,inotifywait命令可以设置超时时间,如果在指定的秒数内没有检测到任何事件,inotifywait将退出。这样可以避免inotifywait一直运行,占用系统资源。例如:
[linux@bashcommandnotfound.cn ~]$ inotifywait -t 10 /home/test
Setting up watches.
Watches established.
Timeout occurred.

上面的命令表示监控/home/test目录的所有事件,如果在10秒内没有检测到任何事件,inotifywait将退出,并输出Timeout occurred。

  • 如果使用-o选项,inotifywait命令可以将事件输出到指定的文件,而不是标准输出。这样可以方便地保存和分析事件的记录。但是,如果输出的文件和监控的文件或目录在同一个文件系统中,那么可能会产生循环的事件,导致inotifywait不断地输出。为了避免这种情况,可以使用--exclude或--excludei选项排除输出的文件,或者将输出的文件放在不同的文件系统中。例如:
[linux@bashcommandnotfound.cn ~]$ inotifywait -m -o /tmp/log.txt /home/test
Setting up watches.
Watches established.

上面的命令表示持续地监控/home/test目录的所有事件,并将事件输出到/tmp/log.txt文件,因为/tmp和/home是不同的文件系统,所以不会产生循环的事件。

  • 如果在执行inotifywait命令时,出现了bash: inotifywait: command not found的错误,那么可能是因为没有安装inotify-tools包,或者没有将inotifywait命令的路径添加到PATH环境变量中。为了解决这个问题,可以根据不同的Linux发行版,使用相应的命令安装inotify-tools包,或者使用绝对路径或相对路径来执行inotifywait命令。

Linux inotifywait相关命令

0

评论区