rsync+inotify-tools实现文件自动同步

发布于 2020-07-08  1.2k 次阅读


环境:centos7.4,已配置双机ssh免密登录
机器:
192.168.0.231 主服务器 目录 /node1
192.168.0.64 客户端服务器 目录 /node2
需求:这两个服务器的2个文件目录保持实时同步

说明:

Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。
通俗来说,inotify可以监控文件的状态并且对变化的状态做出一些操作。
uname -a
Linux ansible-dev 3.10.0-327.el7.x86_64
版本2.6.32 大于2.6.13,则支持。
执行:
ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Oct 18 12:18 max_queued_events
-rw-r--r-- 1 root root 0 Oct 18 12:18 max_user_instances
-rw-r--r-- 1 root root 0 Oct 18 12:18 max_user_watches
有三项输出,则表示默认支持inotify,可以安装inotify-tools工具.
centos7版本上面已经默认安装了rsync和xinetd服务
rpm -aq |grep rsync
rpm -aq |grep xinetd
如无:
主服务器跟客户端服务器执行
yum -y install xinetd
yum -y install rsync
关闭防火墙和SELINUX,两台主机都执行
[root@localhost bin]sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
[root@localhost bin]getenforce
Enforcing
[root@localhost bin]setenforce 0
[root@localhost bin]systemctl stop firewalld && systemctl disable firewalld && systemctl stop iptables && systemctl disable iptables
主服务器:新建rsync配置文件及要同步的目录
mkdir -p /node1
mkdir -p /etc/xinetd.d/
vim /etc/xinetd.d/rsync
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
port = 873
log_on_failure += USERID
}
主服务器修改配置文件发布共享目录
vim /etc/rsyncd.conf       
uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
log file= =/var/run/rsyncd.log

[test]
path= /node1
comment= analyse
read only = false
hosts allow = *

主服务器默认启动

[root@ansible-dev tmp]#/usr/bin/rsync --daemon
[root@ansible-dev tmp]# netstat -ltnup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 8005/rsync
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 5455/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6297/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6789/master
能看到873端口在监听,客户端服务器也需要启动rsync,并且防火墙和selinux都需要关闭或者开发873端口;
--如果你的配置文件是自己定的位置,那么在后面跟上conf文件的参数就可以了
[root@ansible-dev tmp]#/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
#建立服务器密码认证文件,参考网上其他的文章,是源服务器需要用户:密码,实际本人测试是源服务器端只需要密码,目标服务器的密码文件需要用户:密码。
[root@ansible-dev tmp]#echo "Ldm@147851" > /etc/rsyncd.passwd

主服务器安装inotify-tools

[root@ansible-dev tmp]#cd /usr/local
[root@ansible-dev tmp]#yum install autoconf automake libtool ncurses-devel -y
[root@ansible-dev tmp]#wget https://github.com/inotify-tools/inotify-tools/archive/refs/tags/3.21.9.6.zip
[root@ansible-dev tmp]#unzip 3.21.9.6.zip
[root@ansible-dev tmp]#cd inotify-tools-3.21.9.6
[root@ansible-dev tmp]#./autogen.sh
[root@ansible-dev tmp]#./configure --prefix=/usr/local/inotify-tools && make && make install
[root@ansible-dev tmp]#ln -s /usr/local/inotify-tools/bin/inotifywait /usr/bin/inotifywait
--新建启动配置脚本
[root@ansible-dev tmp]#vim inotify.sh
#!/bin/bash
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib /node1/ |while read events
do
/usr/bin/rsync -vzrtopg --delete --progress /node1/ rsync@192.168.0.98::test --password-file=/etc/rsyncd.passwd
echo "`date +'%F %T'` 出现事件 $events" >>/tmp/rsync.log 2>&1
done
[root@ansible-dev tmp]chmod +x inotify.sh
[root@ansible-dev tmp]nohup sh inotify.sh &
nohup: 忽略输入并把输出追加到"nohup.out"
空格跳过

客户端服务器:新建rsync配置文件及要同步的目录

[root@web-client node1]# vim /etc/rsyncd.conf
[test]
path = /node2/
read only = false
uid = root
gid = root
[root@web-client node1]mkdir -p /node2
[root@web-client node1]/usr/bin/rsync --daemon
[root@web-client node1]netstat -ltnup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1051/master
tcp 0 0 0.0.0.0:45954 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 936/zabbix_agentd
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 2927/rsync
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 914/sshd
看的873端口在监听
#建立客户端的rsync用户密码认证文件,服务器端这个文件也需要,但只需要用户的密码即可。
[root@web-client node1]echo "rsync:Ldm@147851" > /etc/rsyncd.passwd

服务端服务器执行

#测试
[root@ansible-dev tmp]#rsync -a 192.168.0.98::test
drwxr-xr-x 18 2020/07/08 16:12:48 .
drwxr-xr-x 4,096 2020/07/08 16:11:55 node1
[root@ansible-dev tmp]# touch /node1/hallo{1..5}.txt
[root@ansible-dev tmp]# tail -f /tmp/rsync.log
2020-07-08 15:33:05 出现事件 CREATE /node1/hallo1.txt
2020-07-08 15:33:05 出现事件 ATTRIB /node1/hallo1.txt
2020-07-08 15:33:06 出现事件 CREATE /node1/hallo2.txt
2020-07-08 15:33:06 出现事件 ATTRIB /node1/hallo2.txt
2020-07-08 15:33:06 出现事件 CREATE /node1/hallo3.txt
2020-07-08 15:33:06 出现事件 ATTRIB /node1/hallo3.txt
2020-07-08 15:33:06 出现事件 CREATE /node1/hallo4.txt
2020-07-08 15:33:06 出现事件 ATTRIB /node1/hallo4.txt
2020-07-08 15:33:06 出现事件 CREATE /node1/hallo5.txt
2020-07-08 15:33:07 出现事件 ATTRIB /node1/hallo5.txt
#杀死inotify.sh
ps aux |grep inotify.sh|awk '{print $2}' |xargs kill -9

在客户端服务器查看,能看到同步过来的5个文件

[root@web-client node2]# ll
总用量 0
-rw-r--r-- 1 root root 0 7月 8 16:11 hallo1.txt
-rw-r--r-- 1 root root 0 7月 8 16:11 hallo2.txt
-rw-r--r-- 1 root root 0 7月 8 16:11 hallo3.txt
-rw-r--r-- 1 root root 0 7月 8 16:11 hallo4.txt
-rw-r--r-- 1 root root 0 7月 8 16:11 hallo5.txt

完毕!

扩展
但当文件越来越多(百万级数量html,jpg等小文件),同步就越来越慢,做不到实时,这时候就需要优化上面的inotify_bak.sh脚本,要做到实时,就必须要减少rsync对目录的递归扫描判断,尽可能的做到只同步inotify监控到已发生更改的文件。结合rsync的特性,所以这里要分开判断来实现一个目录的增删改查对应的操作。
脚本参考 https://www.cnblogs.com/ginvip/p/6430986.html

vim /home/shell/inotify_test.sh
#!/bin/bash
src=/node1/ # 需要同步的源路径
des=test # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件
ip1=192.168.1.203 # 目标服务器1
ip2=192.168.0.95 # 目标服务器2
user=rsync # rsync --daemon定义的验证用户名
# 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
cd ${src}
/usr/local/inotify-tools/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file

# 把监控到有发生更改的"文件路径列表"循环
do
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE
echo "-------------------------------$(date)------------------------------------"
echo $file
#增加、修改、写入完成、移动进事件
#增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
# INO_FILE变量代表路径哦 -c校验文件内容
#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡)
#然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径
#并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ]
# 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
then
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
fi
fi
done

#后台执行启动脚本

[root@ansible-dev tmp]nohup sh /home/shell/inotify_test.sh 2>&1 >> /home/shell/inotify.log &
[root@ansible-dev tmp]touch /node1/{1..3}.txt
[root@ansible-dev tmp]tail -f /home/shell/inotify.log
-------------------------------Wed Dec 29 16:31:22 CST 2021------------------------------------
ATTRIB ./D/202112/20211201/1.txt
ATTRIB
sending incremental file list

sent 54699 bytes received 14 bytes 9947.82 bytes/sec
total size is 26808556 speedup is 489.99
-------------------------------Wed Dec 29 16:31:27 CST 2021------------------------------------
CLOSE_WRITEXCLOSE ./D/202112/20211201/1.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list

sent 54699 bytes received 14 bytes 12158.44 bytes/sec
total size is 26808556 speedup is 489.99
-------------------------------Wed Dec 29 16:31:31 CST 2021------------------------------------
CREATE ./D/202112/20211201/2.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list

sent 54699 bytes received 14 bytes 9947.82 bytes/sec
total size is 26808556 speedup is 489.99
-------------------------------Wed Dec 29 16:31:36 CST 2021------------------------------------
ATTRIB ./D/202112/20211201/2.txt
ATTRIB
sending incremental file list

sent 54699 bytes received 14 bytes 9947.82 bytes/sec
total size is 26808556 speedup is 489.99
-------------------------------Wed Dec 29 16:31:41 CST 2021------------------------------------
CLOSE_WRITEXCLOSE ./D/202112/20211201/2.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list

sent 54699 bytes received 14 bytes 9947.82 bytes/sec
total size is 26808556 speedup is 489.99
-------------------------------Wed Dec 29 16:31:46 CST 2021------------------------------------
CREATE ./D/202112/20211201/3.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list

sent 54699 bytes received 14 bytes 9947.82 bytes/sec
total size is 26808556 speedup is 489.99
-------------------------------Wed Dec 29 16:31:51 CST 2021------------------------------------
ATTRIB ./D/202112/20211201/3.txt
ATTRIB
sending incremental file list

sent 54699 bytes received 14 bytes 9947.82 bytes/sec
total size is 26808556 speedup is 489.99
-------------------------------Wed Dec 29 16:31:56 CST 2021------------------------------------
CLOSE_WRITEXCLOSE ./D/202112/20211201/3.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list

在客户端服务器能看到同步过来的5个文件

[root@web-client node2]# ll
总用量 80
-rw-r--r-- 1 root root 0 12月 29 16:31 1.txt
-rw-r--r-- 1 root root 0 12月 29 16:31 2.txt
-rw-r--r-- 1 root root 0 12月 29 16:31 3.txt
-rw-r--r-- 1 root root 0 12月 29 16:31 4.txt
-rw-r--r-- 1 root root 0 12月 29 16:31 5.txt

附录:

Rsync命令参数详解
在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命令来实现将服务器端的文件备份到客户端来。rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。
Rsync的命令格式可以为以下六种:

1 rsync [OPTION]... SRC DEST
2 rsync [OPTION]... SRC [USER@]HOST:DEST
3 rsync [OPTION]... [USER@]HOST:SRC DEST
4 rsync [OPTION]... [USER@]HOST::SRC DEST
5 rsync [OPTION]... SRC [USER@]HOST::DEST
6 rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

对应于以上六种命令格式,rsync有六种不同的工作模式:
  1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。如:rsync -a /data /backup
  2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。如:rsync -avz *.c foo:src
  3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。如:rsync -avz foo:src/bar /data
  4)从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack
  5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www
  6)列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www

rsync参数的具体解释如下:

1 -v, --verbose 详细模式输出
2 -q, --quiet 精简输出模式
3 -c, --checksum 打开校验开关,强制对文件传输进行校验
4 -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
5 -r, --recursive 对子目录以递归模式处理
6 -R, --relative 使用相对路径信息
7 -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
8 --backup-dir 将备份文件(如~filename)存放在在目录下。
9 -suffix=SUFFIX 定义备份文件前缀
10 -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
11 -l, --links 保留软链结
12 -L, --copy-links 想对待常规文件一样处理软链结
13 --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
14 --safe-links 忽略指向SRC路径目录树以外的链结
15 -H, --hard-links 保留硬链结
16 -p, --perms 保持文件权限
17 -o, --owner 保持文件属主信息
18 -g, --group 保持文件属组信息
19 -D, --devices 保持设备文件信息
20 -t, --times 保持文件时间信息
21 -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
22 -n, --dry-run现实哪些文件将被传输
23 -W, --whole-file 拷贝文件,不进行增量检测
24 -x, --one-file-system 不要跨越文件系统边界
25 -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
26 -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
27 --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
28 -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
29 --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
30 --delete 删除那些DST中SRC没有的文件
31 --delete-excluded 同样删除接收端那些被该选项指定排除的文件
32 --delete-after 传输结束以后再删除
33 --ignore-errors 及时出现IO错误也进行删除
34 --max-delete=NUM 最多删除NUM个文件
35 --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
36 --force 强制删除目录,即使不为空
37 --numeric-ids 不将数字的用户和组ID匹配为用户名和组名
38 --timeout=TIME IP超时时间,单位为秒
39 -I, --ignore-times 不跳过那些有同样的时间和长度的文件
40 --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
41 --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
42 -T --temp-dir=DIR 在DIR中创建临时文件
43 --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
44 -P 等同于 --partial
45 --progress 显示备份过程
46 -z, --compress 对备份的文件在传输时进行压缩处理
47 --exclude=PATTERN 指定排除不需要传输的文件模式
48 --include=PATTERN 指定不排除而需要传输的文件模式
49 --exclude-from=FILE 排除FILE中指定模式的文件
50 --include-from=FILE 不排除FILE指定模式匹配的文件
51 --version 打印版本信息
52 --address 绑定到特定的地址
53 --config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
54 --port=PORT 指定其他的rsync服务端口
55 --blocking-io 对远程shell使用阻塞IO
56 -stats 给出某些文件的传输状态
57 --progress 在传输时现实传输过程
58 --log-format=formAT 指定日志文件格式
59 --password-file=FILE 从FILE中得到密码
60 --bwlimit=KBPS 限制I/O带宽,KBytes per second
61 -h, --help 显示帮助信息

inotifywait命令使用
优化 Inotify

# 在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制

-----------------------------
max_user_watches #设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances #设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量
----------------------------
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就可以实现每次重启都生效
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_queued_events

示例:监听/usr/local/src 目录:

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e' -e modify,delete,create,attrib /usr/local/src

参数 说明

-m 持续监听
-r 使用递归形式监视目录
-q 减少冗余信息,只打印出需要的信息
-e 指定要监视的事件,多个时间使用逗号隔开
--timefmt 时间格式
--format 监听到的文件变化的信息

--timefmt 说明:
ymd分别表示年月日,H表示小时,M表示分钟

--format 说明:
参数 说明
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式
执行上面的命令之后,在监听的目录下创建一个1.txt文件,得到如下结果:

22/03/18 17:22 /usr/local/src/ 1.txt CREATE
22/03/18 17:22 /usr/local/src/ 1.txt ATTRIB
可监听的时间有:

参数 说明
access 访问,读取文件。
modify 修改,文件内容被修改。
attrib 属性,文件元数据被修改。
move 移动,对文件进行移动操作。
create 创建,生成新文件
open 打开,对文件进行打开操作。
close 关闭,对文件进行关闭操作。
delete 删除,文件被删除。

inotify监听文件状态

查看inotify 软件
inotifywait命令可以用来收集有关文件访问信息
inotifywatch命令用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
基本用法

[root@250 nginx]# inotifywait -h
inotifywait 3.14
Usage: inotifywait [ 选项 ] file1 [ file2 ] [ file3 ] [ ... ]
选项:
@<file> 排除某些文件.
--exclude <pattern> 排除匹配的文件
--excludei <pattern> 大小写不敏感排除指定样式的文件
-m|--monitor 保持监听状态,如果不设置这个选项,inotifywait只执行一次就会退出。
-d|--daemon 类似于-m,但是在后台运行,输出事件到特定的文件可以通过 --outfile. 意味着 --syslog.
-r|--recursive 递归监听目录
-s|--syslog 发送错误日志到syslog而不是stderr
-q|--quiet 静态模式,不输出信息
-qq 什么都不输出
--timefmt <fmt> 时间格式
-e|--event <event1> [ -e|--event <event2> ... ]
监听指定的事件,如果不指定,所有的事件都被监听。
Exit status:
0 - 收到了指定的事件
1 - 收到了没有指定的事件,或者出现了一些错误
2 - 没有收到事件

可以监听的事件:
access 访问,读取文件。
modify 修改,文件内容被修改。
attrib 属性,文件元数据被修改。
move 移动,对文件进行移动操作。
create 创建,生成新文件
open 打开,对文件进行打开操作。
close 关闭,对文件进行关闭操作。
delete 删除,文件被删除。

案例
只有当nginx的配置文件写入完成的时候重启nginx

#!/bin/bash
inotifywait -m -e close_write -r /usr/local/openresty/nginx/conf/ |
while read events;
do
echo $events;
nginx -s reload;
echo "Nginx reloaded!"
done

监听某个目录下的文件状态,输出事件

#!/bin/bash
#filename watchdir.sh
path=$1
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y/%H:%M' --format '%T %[w](http://man.linuxde.net/w "w命令") %f' -e modify,delete,create,attrib $path

总结
介绍了inotify-tools的一些特性,与命令的使用。
inotify可以监控文件的状态并且对文件变化的状态做出一些自定义操作。

扩展:https://www.cnblogs.com/jackyyou/p/5681126.html


公交车司机终于在众人的指责中将座位让给了老太太