更新目录内容时如何运行命令?


27

有一个目录,A其内容经常被其他人更改。

我已经建立了一个个人目录B,其中存放了曾经存在的所有文件A

目前,我只是偶尔运行rsync需要的档案从备份AB。但是,我担心某些文件可能会被添加进来A,然后再从中删除,A然后才有机会将它们复制到B

防止这种情况发生的最佳方法是什么?理想情况下,每次A获取内容更改时,我都希望运行当前的备份脚本。

Answers:


29

如果安装了inotify-tools,则可以inotifywait在文件或目录写入以下内容时触发操作:

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

在这种情况下,如果-qq开关完全处于静默状态,-r则是递归的(如果需要),并且-e是要监视的事件modify。来自man inotifywait

修改
监视文件或监视目录中的文件已写入。

5
incrond可能也很有趣。
肖恩·高夫

1
凉。我是否将上述脚本放在我的bashrc中,以便它在我登录时运行?有没有其他方法可以让我一直运行?
oadams

对于登录,/etc/profile对于系统范围或.bash_profile仅对您的用户是。要在引导后运行它,取决于您的Unix / Linux风格。/etc/rc.local/etc/rc.d//etc/init.d/
jasonwryan

1
对于较大的目录,您可能需要考虑使用--monitor开关(并将输出通过管道传递到循环中),否则inotifywait,一遍
又一遍地

该解决方案为通过FTP服务器添加到目录树中的每个文件运行脚本的可靠性如何(假设平均每3分钟添加一个新文件,这种情况可能会持续数年)?如果不是很好,是否有替代解决方案?
Nikola Novak

5

严格来说,如果有人丢弃文件并很快将其删除,您可能会错过它。使用inotify(在Linux下,或在其他unices下,使用类似功能)可以减小风险范围。

如果您可以在该目录上挂载您选择的文件系统(我知道这可能不是一个选择),则可以放置一个记录所有文件版本的文件系统,例如copyfs


4

尝试使用entr命令行工具,该工具可以在文件更改时运行任意命令。从2.9版本开始,添加了目录监视选项(-d)以在将新文件添加到目录时对事件做出反应。

如果将新文件添加到项目中,则运行实用程序的示例:

$ while true; do
> echo src/* | entr -d your_command
> done

在目录监视模式下,每个文件的父目录都隐式添加到监视列表中。

这样做的唯一含义是,如果出现新文件,则必须退出该文件以允许外部Shell循环重新扫描文件系统。

这是不带目录监视选项的版本:

$ while true; do
> echo src/* src | entr your_command
> done

根据您的需要,这是一个更简单的示例:

$ ls -d * | entr sh -c 'rsync -vuar A B'

检查:entrproject.org网站以获取更多详细信息。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.