2012-01-05 1 views
1

lsofコマンドを使用すると、あるプロセスでファイルが使用されているかどうかを判断できますが、ファイルを原子的にチェックして、 。これらのファイルは、私が制御できないさまざまな他のプログラムで使用されているため、アドバイザリロックを使用することはできません。その目的は、他のプロセスがそのファイルを変更するのを止めることです。そのため、プロセスが開いている間にファイルを移動するだけでOKではありません。どんな解決策ですか?他のプロセスが使用していないときにのみLinuxでファイルを移動

更新:私の目的に合っていると思う解決策が私にはちょうど起こりました。最終目標は、これらのファイルを他のプログラムが変更を完了したときに最終状態で処理することです。ファイルを別のディレクトリに移動すると、lsofを使用して古いパスからまだ使用中かどうかを確認できます。もしそうなら、私はそれがもはや使用されなくなり、ファイルを処理するまで、もう一度チェックします。ファイルを別のディレクトリに移動することによって、ユーザとプログラムからファイルを隠します。私はlsofを使ってファイルを処理する間にファイルを開く機会があるので、ユーザとプログラムには古いディレクトリのファイルが見えないようにしたい。つまり、ファイルを変更された状態で処理することになる。

+0

ない、これがうまくいくかどうかわからが、ちょうど読み、それをしませマーキングしようとか、それ以上の書き込み可能:-RWます。chmod 私の推測すでにオープンしているので、実行中のプロセスには影響しません。 – PlexQ

+0

他のプロセスが既にファイルを開いている場合、ファイルを移動することは効果がありません。ただ移動するだけです。他のプロセスがファイルを開くのを待たずに助けてくれますか? –

答えて

5

fuserはどうですか?これをファイル上で実行すると、そのファイルを使用するプロセスのPIDが表示されます。 PIDがない場合、ファイルを使用することはありません。また、ファイルを使用するプロセスがない場合は、ゼロ以外の終了コードも返します。

しかし、fuserコマンドが返された後、そしてmvの前にプロセスがファイルを開く可能性があるため、引き続き競合状態になる可能性があることに注意してください。

ない場合は使用中のファイルを移動するためのいくつかのサンプルコード:あなたと仮定するとあなたは何かがそれにアクセスしているファイルを移動することができます

if ! fuser /my/file 
then 
    mv /my/file /somewhere/else 
fi 
+1

フューザーについて聞いたことがありませんが、それはlsofと同じ競合状態の問題のようです。 – Jegschemesch

2

は、(rename(2)システムコールを使用して同じファイルシステム上でそれを移動するmvをソースとターゲットが同じファイルシステム上にある場合に使用します)。 unlink(2)システムコールを使用して削除することもできます。そしてそのようなファイルを移動することは、同じ経路でそれにアクセスするための他の将来のプロセスを確かに禁止します。

何かにアクセスしたときに通知するためにinotify(7) APIを使用することもできます。

少なくとも、ファイルシステムによってはmandatory lockingと考えることもできます。

が、噂強制ロックがうまく動作しないことであり、バギー可能性があり、時には

関連する問題