当一个文件仍在写入时同步两个文件

时间:2010-11-27 00:12:41

标签: linux shell synchronization streaming rsync

我有一个应用程序(视频流捕获),它不断将其数据写入单个文件。应用程序通常运行几个小时,创建〜1 GB的文件。退出后很快(几秒钟内),我想要写一份正在写的2份文件 - 比方说,/mnt/disk1中的一份,/mnt/disk2中的另一份(后者是一份)带有FAT32文件系统的USB闪存盘。)

我真的不喜欢将应用程序修改为同时写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手动创建命名管道,并显示正在编码的内容,作为奖励:)

2 个答案:

答案 0 :(得分:4)

嗯...这个文件在写入时是不可用的,所以为什么不通过管道/ fifo“欺骗”你的程序写入并使用第二个非常简单的程序创建2个副本? / p>

这样,您可以在原始流程结束后立即获得两份副本。

答案 1 :(得分:-1)

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