机器环境Ubuntu Server 20.04 LTS

inotify

安装
sudo apt-get install inotify-tools

脚本,保存为inosync-new.sh

#!/bin/sh
while inotifywait -mrq --format "%w%f" -e create,modify,delete /shareDoc/TestLog/test; do {rsync -avz /shareDoc/TestLog/test/* -e "ssh -i /home/user/Desktop/datasync" user@3.3.3.163:/testlog/abc/}; done

运行时显示如下,在test文件夹下创建文件666.txt,脚本检测到这个新文件,因此触发rsync同步

通过inotify和incron实现事件驱动自动数据传输_inotify

但是发现inotify有个问题就是只能通过shell脚本方式运行,无法成为系统服务,搜索后发现incron可以实现。

incron

安装

sudo apt-get install incron
incrond start
service incron status

sudo vim /etc/incron.allow

添加root,运行root用户运行,不然会提示没有权限

编辑incron, 类似crontab,只是不跟cron那样要设置时间

incrontab -e

/shareDoc/TestLog/test/A IN_MODIFY,IN_CREATE /bin/bash /root/run.sh
/shareDoc/TestLog/test/B IN_MODIFY,IN_CREATE /bin/bash /root/run.sh
/shareDoc/TestLog/test/C IN_MODIFY,IN_CREATE /bin/bash /root/run.sh
/shareDoc/TestLog/test/D IN_MODIFY,IN_CREATE /bin/bash /root/run.sh

这里设定了好多个文件夹的原因是incron不支持子文件夹的检测,只支持监控当前文件夹路径

run.sh 的内容,这里设置同步完后删除源文件,除了csv格式,另外使用key验证自动登陆远程服务器

rsync -az --remove-source-files --exclude="*.csv" /shareDoc/TestLog/test/* -e "ssh -i /root/s3sync" user@3.3.3.163:/mount/abc/

rsync -az --include="*.csv" /shareDoc/TestLog/test/* -e "ssh -i /root/s3sync" user@3.3.3.163:/mount/abc/

这里第二条rsync使用include 将csv包括进来,是因为第一条为了实现同步并删除其它格式的文件,而需要保留csv文件在服务器上不删除

 

查看运行

incrontab -l
tail /var/log/syslog

在文件夹里创建一个777.txt的文件夹,系统自动发现,然后触发sh运行,这是Ubuntu Server 20.04,能看到具体是什么文件,例如这里是777.txt这个文件创建和修改,但是同样在Ubuntu Server 16.04下测试,却不会显示具体文件名的信息,只会提示检测有更改然后运行sh的log

通过inotify和incron实现事件驱动自动数据传输_incron_02