どのように私は別のプロセスによって使用されているファイルをタールができますか?
質問
私は、ディレクトリをアーカイブしています。このディレクトリには、別のプロセスによって書き込まれているファイルがあります。私はこの使用してLinuxのtar / Perlのタールモジュールタール場合は、アーカイブ内のファイルのエントリがありますが、内容は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
untarをした後、
-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
どのように私はこの問題を解決することができますか?私は、ファイルが、それは瞬間にそれがアーカイブされた内容のアーカイブになりたいです。このファイルは、ログファイルであると私たちはターリングする前に、ファイルハンドルを閉じることができないと仮定することができます。
解決
あなたはLVMパーティションを使用している可能性があります。 確かにあなたはLVMパーティション上で実行している場合は、LVMのスナップショット機能を使用することができます。
ここでの操作 LVMのドキュメントへのリンクがあります>。
ここで LVMスナップショットイントロするます:
LVMが提供する素晴らしい施設は、「スナップショット」です。これにより、管理者は、ある時点で凍結した論理ボリュームの正確なコピーを提示し、新たなブロックデバイスを作成することができます。通常、これは、いくつかのバッチ処理、インスタンスのバックアップは、論理ボリューム上で実行する必要がある場合に使用されるだろうが、あなたは、データを変更しているライブシステムを停止する必要はありません。スナップショットデバイスは、システム管理者に終了したときにだけ、デバイスを削除することができます。 LVM1用VFSロックパッチは、スナップショットが作成されたときに、いくつかのファイルシステムはこれを自動的に行うことを確認し、そして多くの - この機能は、スナップショットは、論理ボリューム上のデータが一貫した状態にある時に行われることを要求んスナップショットは、パッチを適用せずに作成されたときに2.6カーネルでのファイルシステムは自動的にこれを行います。
他のヒント
最初のファイルをコピーしてください...
cp a a.tmp
cp b b.tmp
cp c c.tmp
...その後、一緒にすべてをtarballに...
tar *.tmp abc.tar
...とクリーンアップ:
rm *.tmp
問題が解決しない場合は、ファイルハンドルを保持しているプロセスが読み取りアクセスを共有することを望んでいない...
あなたはこれを使用し、ファイルシステムやファイルにアクセスしているアプリケーションに依存していることかもしれません。一般的な解決策に最も近いスナップショットをサポートしているファイルシステムを使用してタールを実行する前にスナップショットを作成することです。
あなたの第二の出力が行われるの後には最初、そうすることはできません。私はtar
はここであることを推測している:それは、その仕事をしていたとき、ファイルが空でした。あなたがここに競合状態に対処することができる。
、それが使用されているファイルシステム&OSに依存します。最初sync
(または同等のファイルシステム上にあるものは何でも)、一時ディレクトリにファイルをコピーし、それらをアップタール。ファイルシステムを使用すると、開いているファイルをコピーすることはできません場合は、SOLです。 Perlは、ファイルシステムの制限を回避することはできません。