备份需要永远。在我们可以信任 btrfs 或 ZFS 来备份增量快照之前,如果有一个守护进程使用 inotify 来跟踪哪些文件实际发生了变化,以便备份运行得更快,那不是很好吗?这个程序在哪里?
如何备份我的 Linux 机器而不必每次都抓取整个文件系统?我想要一个程序来检测新的或更改的照片、源代码等,并将它们排队复制到我的 NAS。
我想在新文件复制到特定目录时自动运行脚本。换句话说,在 Linux 中有没有办法“观察”一个目录的变化,然后运行一些东西来响应变化?
我有一个场景,我每天将 .csv 文件上传到特定文件夹 /tmp/data_upload,旧文件被新文件替换。
上传数据后,我需要运行 Python 脚本。为此,我有一个想法来创建一个 cron 作业并监视文件中的更改。我试过使用 inotify,但我对 Unix 域不太了解。我怎样才能做到这一点?
一旦上传文件夹中的文件发生日期更改,我需要执行脚本 test.py,例如 /tmp/data_upload。
每次我对文件进行一些更改并保存时,我都希望运行一个命令。我可以设置一个 Ruby 脚本来监控文件并按照我的意愿运行命令,但我突然想到应该有一些简单的 Unix 方法来做到这一点。在那儿?我在 Ubuntu 8.10 上,稍微不那么模糊。
编辑:
incron
被推荐了,看起来不错。但是我无法让它工作(编辑:当我在指定目录中保存文件时,命令似乎没有运行,或者我的命令有问题)。我安装了 incron 并使用 incrontab 设置了我用户的 incron 表,并将用户添加到允许列表中。我的具体情况是编辑 TeX 文件。我希望每次编辑和保存 TeX 文件时,命令都将其呈现为 PDF 以运行。所以这是我想出的 incron 表条目:
/home/ehsanul/Documents/latex IN_CLOSE_WRITE echo $@/$# | grep \\.tex$ | xargs xelatex
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
假设我有 100 万个文件,文件列表大概是 20MB。如果我只添加一个文件,inotify
会告诉rsync
传输文件列表和新文件。我的网络不好,我可能不得不限制带宽 ( --bwlimit
)。
可能会一次添加多个文件,并且鉴于网络传输速度,可能会同时运行多个 rsync。
这值得么?有没有更好的办法?
作为 CentOs 6.4 服务器的 root,我在应用程序中收到此错误:
Fri May 16 01:45:23 2014 Error: Terminating since out of inotify watches.
Consider increasing /proc/sys/fs/inotify/max_user_watches
Run Code Online (Sandbox Code Playgroud)
但是当我尝试以 root 身份运行命令时,我的权限被拒绝。
# echo 100000 > /proc/sys/fs/inotify/max_user_watches
-bash: /proc/sys/fs/inotify/max_user_watches: Permission denied
Run Code Online (Sandbox Code Playgroud)
即使我编辑了 /etc/sysctl.conf 我的权限也被拒绝:
# echo fs.inotify.max_user_watches=524288 | tee -a /etc/sysctl.conf
# sysctl -p
error: permission denied on key 'fs.inotify.max_user_watches
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
AFAIK,NFS 的 Linux 实现不支持来自服务器端的类似 inotify 的事件通知——是否有解决方法、补丁或替代解决方案可以产生相同的数据?
我需要找出安装程序所做的所有文件系统修改。最有可能安装的包是 rpm 或 deb,但应用程序当然可以简单地复制或编译并使用 configure;make;make install 方式安装。即使 rpm 和 deb 有文件列表,它们的安装后脚本也可以进行额外的文件系统修改。
我首先去寻找可以监视另一个应用程序以查找另一个应用程序所做的所有文件系统修改的应用程序。我没有找到。
接下来我研究了分层文件系统,在开始安装应用程序之前,我想我会放入一个分层文件系统,然后将应用程序安装在分层文件系统上,然后找出该层中发生的所有修改。我能找到的最好的是mini_fo但它似乎自 2006 年以来就没有得到维护。它似乎也不能只是覆盖在 / (这会隐藏层中的一些东西)。
然后我研究了基于 inotify 的解决方案,但从 / 开始监视所有内容似乎是不切实际的。例如,inotifywatch (linux.die.net/man/1/inotifywatch) 提到默认手表的限制只有 8k。安装观察者也需要一些时间。似乎也存在错误,新创建的目录不会立即被监视,因此可能会错过它们中的更改。
除了在安装前后从文件系统中获取快照并进行比较之外,还有其他方法可以实现我想要做的事情吗?
我有一个应用程序场,它生成缩略图并使用 nfs 将它们提供给 Web 服务器场。但是性能太差,所以我要在每个网络节点上制作文件的本地副本。
我查看了 unison 和 lsync,但似乎没有可从 centOS5.5 存储库中获得的 rpm。
我应该使用哪个,或其他一些策略。我非常需要立即同步,因为用户需要立即在网页上显示缩略图,所以基于 inotify 的工具很好!
编辑:当我说立即,我的意思是推出而不是按某个时间表拉动。
最后,lsync 发布了更多版本,所以我使用了它,lsync 在运行后运行良好(即在几秒钟内同步)但是它需要事先枚举每个目录,对于非常大的文件系统需要很多小时..
我想通过inotifywait 以递归方式监视创建或修改文件的任何事件的特殊路径,但我不知道我的问题是什么。
我有一些要排除的文件夹。
watchpath
-> folder1
-> file1
-> ingnorefile1 [IGNORE]
-> ignorefolder1 [IGNORE]
Run Code Online (Sandbox Code Playgroud)
如何使用正则表达式正确排除它们?
inotifywait -mr --exclude '(ignorefolder1|folder1\/ingnorefile1)' -e modify -e create -e delete . | while read date time dir file; do
Run Code Online (Sandbox Code Playgroud)
用于实现我的目标的正确正则表达式是什么?