Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 当一个文件仍在写入时同步两个文件_Linux_Shell_Synchronization_Streaming_Rsync - Fatal编程技术网

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

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中已有的内容

我有一个应用程序(视频流捕获),它不断地将数据写入单个文件。应用程序通常运行数小时,创建约1GB的文件。在它退出后不久(几秒钟内),我希望有它正在编写的文件的两个副本—比方说,一个在
/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,以确保它们是相同的。如果它们是相同的,它应该快速检查并很快退出
同步2个文件的最佳方法是什么,最好使用简单的Linux shell实用程序?也许我可以用FUSE/md设备/
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就不是魔术。为了确保两个文件相同,它仍然必须读取每个字节。通过使用校验和,它在网络上节省了大量时间。在单个主机上,磁盘的带宽是上限,遗憾的是,它无法做任何事情来改善这一点。