Синхронизация двух файлов, когда один еще записывается в - PullRequest
1 голос
/ 27 ноября 2010

У меня есть приложение (захват видеопотока), которое постоянно записывает свои данные в один файл.Приложение обычно работает в течение нескольких часов, создавая файл размером ~ 1 гигабайт.Вскоре (через несколько секунд) после его завершения я хотел бы иметь 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?Может быть, я мог бы использовать какой-нибудь хитрый трюк с устройством FUSE / md / tee / tail -f?

Решение

Наилучшим из возможных решений для моего случая является

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

Этот использует магию bash / zsh, называемую «подстановка процесса», что исключает необходимость создания именованных каналов вручную, используя mkfifo, и отображает то, что кодируется, в качестве бонуса:)

Ответы [ 2 ]

4 голосов
/ 27 ноября 2010

Хммм ... файл не пригоден для использования во время записи, так почему бы вам не "обмануть" свою программу для записи через pipe / fifo и не использовать вторую очень простую программу для создания 2 копий? 1001 *

Таким образом, у вас есть две копии, как только закончится исходный процесс.

0 голосов
/ 27 ноября 2010

Прочтите страницу руководства на tee(1).

...