【问题标题】:Syncing two files when one is still being written to当一个文件仍在被写入时同步两个文件
【发布时间】:2010-11-27 00:12:40
【问题描述】:

我有一个应用程序(视频流捕获),它不断将其数据写入单个文件。应用程序通常运行几个小时,创建约 1 GB 的文件。退出后不久(几秒钟内),我想拥有它正在写入的文件的 2 个副本 - 比如说,一个在 /mnt/disk1,另一个在 /mnt/disk2(后者是一个 USB 闪存驱动器FAT32 文件系统)。

我不太喜欢修改应用程序以同时写入 2 个副本的想法,所以我想到了:

  • 应用程序启动并开始写入文件(我们称之为/mnt/disk1/file.mkv
  • 某些实用程序启动,将/mnt/disk1/file.mkv 中已有的内容复制到/mnt/disk2/file.mkv
  • 在获得初始同步状态后,它会继续以类似tail -f 的方式跟踪写入的文件,将从/mnt/disk1/file.mkv 获取的所有内容复制到/mnt/disk2/file.mkv
  • 几个小时过去了
  • 应用程序退出,我们停止同步实用程序
  • 之后,我们快速运行rsync /mnt/disk1/file.mkv /mnt/disk2/file.mkv 以确保它们相同。如果它们相同,它应该只运行一个快速检查并很快退出。

同步 2 个文件的最佳方法是什么,最好使用简单的 Linux shell 可用实用程序?或许我可以对 FUSE / md device / tee / tail -f 使用一些巧妙的技巧?

解决方案

我的情况最好的解决方案似乎是

mencoder ... -o >(
   tee /mnt/disk1/file.mkv |
   tee /mnt/disk2/file.mkv |
   mplayer -
)

这个使用 bash/zsh 特定的魔法,名为“进程替换”,因此无需使用 mkfifo 手动创建命名管道,并显示正在编码的内容,作为奖励:)

【问题讨论】:

  • rsync 并不神奇。为了确保两个文件相同,它仍然必须读取每个字节。它通过使用校验和节省了大量的网络时间。在单个主机上,磁盘的带宽是上限,遗憾的是它无能为力。

标签: linux shell synchronization streaming rsync


【解决方案1】:

嗯...该文件在写入时不可用,那么您为什么不“欺骗”您的程序通过管道/fifo 写入并使用第二个非常简单的程序来创建 2 个副本?

这样一来,原始流程结束后,您就拥有了两份副本。

【讨论】:

  • 嗯...类似mkfifo some-pipe; tee /mnt/disk1/file.mkv >/mnt/disk2/file.mkv <some-pipe; application >some-pipe; killall tee 的东西?它可能会起作用......这里的问题在哪里?有什么潜在的问题吗?
  • @GreyCat: tee 从它的标准输入而不是从作为参数传递的文件(这将是一个输出文件)中获取输入。
  • @Dennis Williamson:是的,这就是标准输入被重定向为<some-pipe 的原因。
  • @GreyCat:这应该可以——而且你也不必杀死tee,它会在应用程序关闭管道时退出。唯一的问题是如果应用程序试图寻找它正在写入的文件。
【解决方案2】:

阅读tee(1)上的手册页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多