2

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

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

4

2 に答える 2

5

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

ただし、fuserコマンドが戻った後、その前にプロセスがファイルを開く可能性があるため、競合状態が発生する可能性があることに注意してくださいmv

使用していない場合にファイルを移動するためのサンプルコード:

if ! fuser /my/file
then
     mv /my/file /somewhere/else
fi 
于 2012-01-05T17:30:17.947 に答える
2

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

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

少なくとも一部のファイル システムでは強制ロックを検討することもできます。

しかし、噂によると、強制ロックはうまく機能せず、時々バグが発生する可能性があります

于 2012-01-05T17:37:57.577 に答える