Как я могу распаковать файл, который используется другим процессом? - PullRequest
3 голосов
/ 18 февраля 2009

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

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

-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

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

Ответы [ 5 ]

4 голосов
/ 18 февраля 2009

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

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

Вот часть заставки LVM :

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

3 голосов
/ 18 февраля 2009

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

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

... тогда тарболите все вместе ...

tar *.tmp abc.tar

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

rm *.tmp

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

2 голосов
/ 18 февраля 2009

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

2 голосов
/ 18 февраля 2009

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

0 голосов
/ 18 февраля 2009

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

...