削除されたがまだアプリケーションで開いている大容量ファイルを見つける方法は?プロセスにそのファイルが開いていても、どのように削除できますか?
状況は、私たちが驚くべき速度でログファイルを埋めるプロセスを実行しているということです。原因を知って修復できます。それまでは、プロセスを閉じずにログファイルをrmまたは消去したいと思います。
単に実行すると、rm output.log
ファイルへの参照のみが削除されますが、プロセスが終了するまでディスク領域を占有し続けます。もっと悪いのは、ingの後にrm
ファイルがどこにあるのか、どのくらい大きいのかわからないということです!ファイルが別のプロセスでまだ開いていても、ファイルを見つけて空にする方法はありますか?
特に、DebianやRHELなどのLinuxベースのオペレーティングシステムに言及しています。
ベストアンサー1
アプリケーションを終了できない場合は、スペースを解放するために削除するのではなく、ログファイルを切り捨てることができます。ファイルが追加モードで開かれていない場合(使用はO_APPEND
リサイクルされます(ただし、スパースファイルをサポートしていないApple OS / XのHFS +ファイルシステムには適用されません)。
切り取り:
: > /path/to/the/file.log
削除された場合、Linuxは次の操作を実行して切り捨てることができます。
: > "/proc/$pid/fd/$fd"
$pid
ファイルを開いたプロセスのプロセスIDと$fd
そのファイルが開かれたファイル記述子(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)
アプリケーションが動的にリンクされている場合のもう1つの方法は、デバッガを接続して呼び出すようにしてから、close(fd)
新しいデバッガを呼び出すことですopen("the-file", ....)
。