2

ファイルをアーカイブするスクリプトまたはコードを作成しようとしていますが、現在開いているものはアーカイブしたくありません。ディレクトリ内のどのファイルが開いているかを判断する方法を見つける必要があります。Perl またはシェル スクリプトのいずれかを使用したいのですが、必要に応じて他の言語を使用することもできます。Linux 環境にあり、lsof を使用するオプションはありません。また、フューザーで一貫性のない結果が得られました。助けてくれてありがとう。

ディレクトリ内のログ ファイルを別のディレクトリに移動しようとしています。ただし、ファイルが開いている場合は、何もしたくありません。

4

3 に答える 3

3

問題へのアプローチが間違っています。読んでいる間にファイルが変更されないようにしたいのですが、オペレーティングシステムのサポートなしではそれを行うことはできません。マルチユーザー システムで期待できる最善の方法は、アーカイブ メタデータの一貫性を保つことです。

たとえば、アーカイブ ディレクトリを作成している場合は、アーカイブに格納されているバイト数がディレクトリと一致していることを確認してください。ファイルシステムを読み取る前後にファイルの内容をチェックサムし、それをアーカイブに書き込んだ内容と比較して、おそらく「不一致」としてフラグを立てることができます。

何を達成しようとしていますか?

コメントに応じて追加:

logrotateこれを一貫して処理する方法についてのアイデアを盗むために見てください。ファイルの名前を変更すると、現在ファイルを書き込んでいるプロセスが壊れてしまうのではないかと心配している場合は、以下をご覧くださいman 2 rename

rename() はファイルの名前を変更し、必要に応じてディレクトリ間でファイルを移動します。ファイルへのその他のハード リンク (link(2) を使用して作成されたもの) は影響を受けません。oldpath のオープン ファイル記述子も影響を受けません。

newpath がすでに存在する場合、それは自動的に置き換えられます (いくつかの条件に従います。以下のエラーを参照してください)。そのため、newpath にアクセスしようとする別のプロセスがそれを見つけられない点はありません。

于 2011-05-31T15:57:57.743 に答える
1

msw は質問に正しく答えましたが、開いているプロセスのリストをファイルしたい場合は、lsofコマンドがそれを提供します。

于 2011-05-31T16:40:39.580 に答える
1

ls -l /proc/*/fd/*ルートとして試してください。

于 2011-05-31T15:56:26.920 に答える