削除されたがアプリケーションで開いたままの大きなファイルを見つけるにはどうすればよいですか?プロセスでファイルが開いている場合でも、どうすればそのようなファイルを削除できますか?
状況は、ログファイルを驚異的な速度でいっぱいにするプロセスを実行しているということです。私はその理由を知っています、そして私はそれを直すことができます。それまでは、プロセスをシャットダウンせずにログファイルをrmまたは空にしたいのですが。
rm output.log
を実行するだけです ファイルへの参照のみを削除しますが、プロセスが終了するまでディスク上のスペースを占有し続けます。さらに悪い:rm
の後 ファイルの場所やサイズを見つける方法がありません。別のプロセスで開いているにもかかわらず、ファイルを見つけて空にする方法はありますか?
特に、DebianやRHELなどのLinuxベースのオペレーティングシステムについて言及します。
承認された回答:
アプリケーションを強制終了できない場合は、ログファイルを削除する代わりに切り捨てて、スペースを再利用できます。ファイルが追加モードで開かれていない場合(O_APPEND
を使用) )、次にアプリケーションがファイルに書き込むとき、ファイルは以前と同じ大きさに表示されます(ただし、先頭部分はスパースで、NULバイトが含まれているように見えます)が、スペースは再利用されます(HFS +には適用されません)。ただし、スパースファイルをサポートしていないApple OS / X上のファイルシステム)。
切り捨てるには:
: > /path/to/the/file.log
すでに削除されている場合、Linuxでは、次のようにして切り捨てることができます。
: > "/proc/$pid/fd/$fd"
$pid
の場所 ファイルが開かれているプロセスのプロセスIDであり、$fd
開いている1つのファイル記述子(lsof -p "$pid"
で確認できます) 。
pidがわからず、削除されたファイルを探している場合は、次のことができます。
lsof -nP | grep '(deleted)'
lsof -nP +L1
、@ user75021で述べられているように、さらに優れた(より信頼性が高く、より移植性の高い)オプションです(リンクが1つ未満のファイルを一覧表示します)。
または(Linuxの場合):
find /proc/*/fd -ls | grep '(deleted)'
または、zsh
で大きなものを見つける :
ls -ld /proc/*/fd/*(-.LM+1l0)
別の方法として、アプリケーションが動的にリンクされている場合は、デバッガーをアプリケーションに接続して、close(fd)
を呼び出すようにします。 その後に新しいopen("the-file", ....)
。