【问题标题】:Automatically detecting file changes and synchronizing via S3通过 S3 自动检测文件更改和同步
【发布时间】:2011-12-07 14:54:56
【问题描述】:

我在 Linux 系统上有一个本地媒体文件目录,我使用 s3sync 脚本与 Amazon S3 账户同步。目前,当我知道媒体文件已被修改时,我正在手动运行 s3sync 脚本。

文件修改后如何自动运行脚本?

我正在考虑创建一个 cron 作业以每隔几分钟运行一次脚本,但这似乎处理量过大,因为即使没有更改,脚本仍然需要扫描整个目录结构,即很大。

我还考虑过incron/inotify,它允许在特定文件或目录发生更改时运行命令,但这些工具似乎并不自动支持监视整个嵌套目录的更改。如果我错了,请纠正我,但似乎 incron/inotify 只能监控他们被明确告知要监控的文件。例如如果我想监视目录内任何级别的所有文件的更改,我必须编写单独的脚本来监视目录和文件添加/删除,以更新 incron 监视的文件和目录列表。

有没有更有效的解决方案?

【问题讨论】:

  • 正如您所说的,inotify 机制 (API) 对目录不是递归的。因此,您需要为监视目录下的子目录创建额外的监视。还要记住,由于每个子目录都会建立一个 inotify watch,因此可能会达到每个用户的最大 inotify watch 数量。默认最大值为 8192,可以通过写入 /proc/sys/fs/inotify/max_user_watches 来增加。也许您可以查看 inotifywatch 源代码(处理递归目录)并在此基础上自己编写一些东西。
  • 您也可以在自己的 shell 脚本中使用 inotifywait 命令。手册页中提供的示例看起来很有前景。

标签: linux bash filesystems amazon-s3 inotify


【解决方案1】:

对于这类任务,我使用的是fssm gem。

创建文件 watcher.rb

require 'fssm'

FSSM.monitor('/dir_to_watch/', '**/*') do
  update {|base, relative| `your_script` }
  delete {|base, relative| `your_script` }
  create {|base, relative| `your_script` }
end

然后:

ruby watcher.rb

如果你愿意,当然可以妖魔化它。

【讨论】:

    【解决方案2】:

    这是一个示例场景,您可以改用简单的 rsync 脚本。

    http://andrewwilkinson.wordpress.com/2011/01/14/rsync-backups-to-amazon-s3/

    基本上意味着使用 fuse 和 s3fs (http://code.google.com/p/s3fs/) 将 s3 共享挂载为本地文件系统上的目录,并使用 rsync 同步 2. 简单的 cron 作业就可以解决问题。

    【讨论】:

      【解决方案3】:

      现在有一个有效的解决方案。这是刚刚宣布的(姗姗来迟):
      http://aws.amazon.com/blogs/aws/s3-event-notification/

      实现起来非常简单 - 是时候扔掉所有丑陋的 cron 作业和列表循环了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-14
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多