Как я могу заархивировать файл, который используется другим процессом?

StackOverflow https://stackoverflow.com/questions/560731

  •  05-09-2019
  •  | 
  •  

Вопрос

Я архивирую каталог.В этом каталоге есть файл, который записывается другим процессом.Когда я записываю это с помощью модуля Linux tar/Perl Tar, в архиве запись для файла есть, но содержимое имеет нулевое значение.

Перед смолированием файлы...

-rw-r--r--  1 irraju dba 28 Feb 18 02:22 a
-rw-r--r--  1 irraju dba 25 Feb 18 02:23 b
-rw-r--r--  1 irraju dba 29 Feb 18 03:38 c

После дегтирования

-rw-r--r-- irraju/dba       28 2009-02-18 02:22:58 a
-rw-r--r-- irraju/dba       25 2009-02-18 02:23:17 b
-rw-r--r-- irraju/dba        0 2009-02-18 03:33:12 c

Как я могу решить эту проблему?Я хочу, чтобы файл находился в архиве с тем содержимым, которое он имел на момент архивирования.Этот файл может быть файлом журнала, и предполагается, что мы не можем закрыть дескриптор файла перед детаргированием.

Это было полезно?

Решение

Поскольку вы отметили вопрос словом «Linux», есть вероятность, что вы используете раздел LVM.Если вы действительно работаете в разделе LVM, вы можете использовать функцию моментального снимка LVM.

Вот ссылка на соответствующую Документация LVM о том, как выполнить операцию.

Вот часть Введение в снимок LVM:

Замечательная возможность, предоставляемая LVM, — это «снимки».Это позволяет администратору создать новое блочное устройство, которое представляет собой точную копию логического тома, замороженного в определенный момент времени.Обычно это используется, когда на логическом томе необходимо выполнить некоторую пакетную обработку, например резервное копирование, но вы не хотите останавливать работающую систему, которая меняет данные.Когда создание моментального снимка устройства будет завершено, системный администратор может просто удалить устройство.Эта возможность действительно требует, чтобы снимок был сделан в тот момент, когда данные на логическом томе находятся в согласованном состоянии - патч блокировки VFS для LVM1 гарантирует, что некоторые файловые системы делают это автоматически при создании снимка, и многие из файловые системы ядра 2.6 делают это автоматически при создании моментального снимка без внесения исправлений.

Другие советы

Попробуйте сначала скопировать файлы...

cp a a.tmp
cp b b.tmp
cp c c.tmp

...затем заархивируйте все вместе...

tar *.tmp abc.tar

... и очистить:

rm *.tmp

Если это не сработает, значит, процесс, содержащий дескриптор файла, не хочет предоставлять доступ для чтения...

Вы можете обнаружить, что это зависит от используемой файловой системы и приложения, обращающегося к файлу.Наиболее близким к общему решению является использование файловой системы, поддерживающей снимки, и создание снимка перед запуском tar.

Ваш второй вывод сделан после твой первый, это не может быть правильно.Я предполагаю, что tar находится прямо здесь:когда он выполнял свою работу, файл был пуст.Возможно, здесь вы имеете дело с состоянием гонки.

Как уже говорили другие, это зависит от используемой файловой системы и ОС. sync сначала (или что-то подобное в вашей файловой системе) скопируйте файлы во временный каталог, а затем заархивируйте их.Если файловая система не позволяет вам скопировать открытый файл, то вы SOL;Perl не может обойти ограничения файловой системы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top