GNU/Linux >> Linux の 問題 >  >> Linux

開いているが削除された大きなファイルを見つけて削除しますか?

削除されたがアプリケーションで開いたままの大きなファイルを見つけるにはどうすればよいですか?プロセスでファイルが開いている場合でも、どうすればそのようなファイルを削除できますか?

状況は、ログファイルを驚異的な速度でいっぱいにするプロセスを実行しているということです。私はその理由を知っています、そして私はそれを直すことができます。それまでは、プロセスをシャットダウンせずにログファイルを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", ....)


Linux
  1. findおよびduコマンドを使用してLinuxで大きなファイルを検索する方法

  2. xargs を使用して、名前にスペースと引用符が含まれるファイルをコピーするにはどうすればよいですか?

  3. ファイルを検索してコピーする

  1. シンボリック リンク:このファイルにリンクしているすべてのファイルを検索します

  2. Linux で find コマンドを使用して、スペースのあるファイルを検索して削除する

  3. テキスト ファイルにリストされているファイルを削除する

  1. findコマンドを使用してLinux上のファイルとディレクトリを検索します

  2. ゾンビプロセスとは何ですか?ゾンビプロセスを見つけて殺す方法は?

  3. で始まるが含まないファイルを削除する