代码之家  ›  专栏  ›  技术社区  ›  GreyCat

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

  •  1
  • GreyCat  · 技术社区  · 13 年前

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

    我不太喜欢修改应用程序以模拟编写两个副本的想法,因此我认为:

    • 应用程序启动并开始写入文件(我们称之为 /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 只是为了确保它们是一样的。如果他们是一样的,那就快速检查一下,很快就退出。

    同步两个文件的最佳方法是什么,最好使用简单的Linux shell可用实用程序?也许我可以用一些聪明的方法来控制FUSE/md设备/ tee / 尾部-f ?

    解决方案

    对我来说最好的解决办法似乎是

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

    这一个使用了bash/zsh特有的名为“进程替换”的魔术,因此无需使用 mkfifo ,并显示正在编码的内容,作为奖励:)

    2 回复  |  直到 13 年前
        1
  •  4
  •   salezica    13 年前

    六羟甲基三聚氰胺六甲醚。。。这个文件在写的时候是不可用的,所以你为什么不通过一个管道/fifo“欺骗”你的程序,然后使用第二个非常简单的程序,来创建两个副本呢?

    这样,一旦原始过程结束,您就有了两个副本。

        2
  •  -1
  •   Steve Emmerson    13 年前

    阅读手册页 tee(1) .