3

ディレクトリをアーカイブしています。このディレクトリには、別のプロセスによって書き込まれているファイルがあります。Linux tar / Perl Tarモジュールを使用してこれをtarすると、アーカイブにファイルのエントリがありますが、内容はnullです。

ファイルをタール化​​する前に...

-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

この問題を解決するにはどうすればよいですか?ファイルをアーカイブした瞬間の内容と一緒にアーカイブに入れたいです。このファイルはログファイルである可能性があり、tarする前にファイルハンドルを閉じることができないと想定しています。

4

5 に答える 5

5

質問に「Linux」のタグを付けたので、LVM パーティションを使用している可能性があります。実際に LVM パーティションで実行している場合は、LVM スナップショット機能を使用できます。

操作の実行方法に関する関連する LVM ドキュメントへのリンクは次のとおりです。

以下は、LVM スナップショットのイントロの一部です。

LVM が提供するすばらしい機能が「スナップショット」です。これにより、管理者は、ある時点で凍結された論理ボリュームの正確なコピーを表す新しいブロック デバイスを作成できます。通常、これは、バックアップなどのバッチ処理を論理ボリュームで実行する必要があるが、データを変更している稼働中のシステムを停止したくない場合に使用されます。スナップショット デバイスの作成が完了したら、システム管理者はデバイスを削除できます。この機能では、論理ボリューム上のデータが一貫した状態にあるときにスナップショットを作成する必要があります。 2.6 カーネルのファイルシステムは、パッチを適用せずにスナップショットが作成されると、これを自動的に行います。

于 2009-02-18T13:13:47.260 に答える
3

最初にファイルをコピーしてみてください...

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

...次に、すべてを一緒にtarballします...

tar *.tmp abc.tar

...そしてクリーンアップ:

rm *.tmp

それが機能しない場合、ファイルハンドルを保持しているプロセスは読み取りアクセスを共有したくありません...

于 2009-02-18T11:52:14.820 に答える
2

2番目の出力は最初の出力のに作成されますが、これは正しくありません。私はそれtarがまさにここにあると推測しています:それがその仕事をしているとき、ファイルは空でした。ここで競合状態を処理している可能性があります。

于 2009-02-18T12:26:45.533 に答える
2

これは、使用するファイルシステムとファイルにアクセスしているアプリケーションによって異なる場合があります。一般的なソリューションに最も近いのは、スナップショットをサポートするファイルシステムを使用し、tarを実行する前にスナップショットを作成することです。

于 2009-02-18T11:53:19.357 に答える
0

他の人が言ったように、それは使用されているファイルシステムとOSに依存します。 sync最初に (またはファイル システム上に同等のものがある場合)、ファイルを一時ディレクトリにコピーしてから、それらを tar します。ファイル システムで開いているファイルをコピーできない場合は、SOL です。Perl はファイル システムの制限を回避できません。

于 2009-02-18T13:16:33.527 に答える