Linux 当一个文件仍在写入时同步两个文件
我有一个应用程序(视频流捕获),它不断地将数据写入单个文件。应用程序通常运行数小时,创建约1GB的文件。在它退出后不久(几秒钟内),我希望有它正在编写的文件的两个副本—比方说,一个在Linux 当一个文件仍在写入时同步两个文件,linux,shell,synchronization,streaming,rsync,Linux,Shell,Synchronization,Streaming,Rsync,我有一个应用程序(视频流捕获),它不断地将数据写入单个文件。应用程序通常运行数小时,创建约1GB的文件。在它退出后不久(几秒钟内),我希望有它正在编写的文件的两个副本—比方说,一个在/mnt/disk1中,另一个在/mnt/disk2中(后者是带有FAT32文件系统的USB闪存驱动器) 我真的不喜欢将应用程序修改为同时编写两个副本,因此我想到: 应用程序启动并开始写入文件(我们称之为/mnt/disk1/file.mkv) 一些实用程序启动,将/mnt/disk1/file.mkv中已有的内容
/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,以确保它们是相同的。如果它们是相同的,它应该快速检查并很快退出
tee
/tail-f
解决方案
对我来说,最好的解决办法似乎是
mencoder ... -o >(
tee /mnt/disk1/file.mkv |
tee /mnt/disk2/file.mkv |
mplayer -
)
这一个使用了bash/zsh特有的名为“进程替换”的魔法,因此无需使用
mkfifo
手动创建命名管道,并显示正在编码的内容,作为奖励:)Hmmm。。。文件在写入时不可用,所以为什么不通过管道/fifo“欺骗”程序,并使用第二个非常简单的程序创建两个副本
这样,原始流程一结束,您就有了两份副本。请阅读
tee(1)
嗯。。。类似于mkfifo的一些管道;tee/mnt/disk1/file.mkv>/mnt/disk2/file.mkv一些管道;基尔尔三通
?这可能有用。。。这里的陷阱在哪里?有任何潜在问题吗?@GreyCat:tee
从其stdin获取输入,而不是从作为参数传递的文件(这将是一个输出文件)获取输入。@Dennis Williamson:是的,这就是为什么stdin被重定向为@GreyCat:这应该可以工作-而且你也不必杀死tee
,当应用程序关闭管道时,它将退出。唯一的问题是,如果应用程序试图在它正在编写的文件上查找,rsync就不是魔术。为了确保两个文件相同,它仍然必须读取每个字节。通过使用校验和,它在网络上节省了大量时间。在单个主机上,磁盘的带宽是上限,遗憾的是,它无法做任何事情来改善这一点。