通过inotify和incron实现事件驱动自动数据传输
Posted simmy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过inotify和incron实现事件驱动自动数据传输相关的知识,希望对你有一定的参考价值。
机器环境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有个问题就是只能通过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实现事件驱动自动数据传输的主要内容,如果未能解决你的问题,请参考以下文章