У меня есть приложение (захват видеопотока), которое постоянно записывает свои данные в один файл.Приложение обычно работает в течение нескольких часов, создавая файл размером ~ 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
, и отображает то, что кодируется, в качестве бонуса:)