【发布时间】: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