Linux监听文件变化并触发指令工具 inotify 使用详解

简介

Linux系统可以使用inotify监听文件、目录的变化(创建、删除、修改等),并触发指令。

例如:当某个文件被修改后,自动重启电脑。

安装

#centos
sudo yum install -y inotify-tools

# ubuntu 
sudo apt-get install -y inotify-tools

使用

实现效果:当/root/video*.jar文件修改后,自动执行脚本/root/deplay.sh

创建监听脚本

echo 'inotifywait -m -e CLOSE_WRITE /root/video*.jar |
while read events;
do
    echo $events;
    sh /root/deplay.sh    
    echo "reload video"
done' > /root/inotify-reboot.sh

运行监听脚本

sh inotify-reboot.sh

参数描述

inotifywait:
-m :实时监控。
-d:后台运行。
-r:递归,对子目录监控。
-q: 表示打印出监控事件。
-e:监控事件。以下
access:访问,读取文件。
attrib: 属性,文件元数据被修改。
close_write:写入关闭事件。
modify:修改,文件内容被修改。
attrib:文件属性变化事件。
delete:文件被删除。
move:移动,对文件进行移动操作。以及重命名,对文件进行重命名。
create:创建,生成新文件
open:打开,对文件进行打开操作。
close:关闭,对文件进行关闭操作。
delete:删除,文件被删除。

--timefmt :当在--format选项中使用%T时,--timefrt选项则可以用来指定自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常用的参数是'%d/%m/%y %H:%M';
--format :自定义inotifywait的输出格式,如--format '%T %w %f';常用的格式符如下:
%w:显示被监控文件的文件名;
%f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;
%T:使用--timefmt选项中自定义的时间格式.
eg. inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write /data #输出时间
eg. innotifywait -mrq --format '%w%f' -e create,close_write,delete /data #简化输出
-q:仅打印监控事件的信息。

使用实例

#!/bin/bash
path=$1
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib $path | while read events;
do
{具体要执行的命令}
done

检测到指定目录中文件有变动时,执行某条命令

#!/bin/bash
CRTDIR=$(cd `dirname $0`; pwd) # 获取当前目录
src=$CRTDIR/packages/
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y%H:%M' --format '%T %w %f' -e close_write $src  | while read events;
do
/usr/bin/php $CRTDIR/artisan vendor:publish  --force --all
done

注意点

在对一个大磁盘进行inotify监听时,爆出如下错误:

Failed to watch /mnt/;

upper limit on inotify watches reached!

Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches’.

cat一下这个文件,默认值是8192,echo 8192000 > /proc/sys/fs/inotify/max_user_watches即可~

注意上面文件要先切换到root用户再执行上面命令,直接改文件不行,必须用上面命令

inotifywait的脚本配合supervisor使用可以达到更好的效果。

参考文档:

https://duanjw.com/posts/adf10dc3/

引用链接

[1] https://duanjw.com/posts/adf10dc3/: https://duanjw.com/posts/adf10dc3/