質問: 開いているが削除されている大きなファイルを見つけて削除する 削除されたがまだアプリケーションで開いている大きなファイルをどのように見つけますか?プロセスが開いていても、そのようなファイルを削除するにはどうすればよいですか?状況は、ログファイルを非常に多くの量でいっぱいにするプロセスを実行している場合です。理由はわかっています。修正できます。それまでは、プロセスをシャットダウンせずにログファイルをrmまたは空にしたいと思います。単にrm output.logはファイルへの参照のみを削除しますが、プロセスが終了するまでディスク上のスペースを占有し続けます。さらに悪いことに、rmingの後で、ファイルの場所や大きさを見つける方法がなくなりました。別のプロセスでまだ開いている場合でも、ファイルを検索して空にする方法はありますか?特に、debianやrhelなどのlinuxベースのオペレーティングシステムについて言及します。
回答: アプリケーションを強制終了できない場合は、ログファイルを削除する代わりに切り捨ててスペースを解放できます。ファイルが追加モードで開かれていない場合(_o_append_を使用)、ファイルは次にアプリケーションがファイルに書き込むときと同じ大きさで表示されます(ただし、先頭部分はスパースであり、nulバイトが含まれているように見えます) )、ただしスペースは再利用されます(ただし、apple os/xはスパースファイルをサポートしていません)のhfs +ファイルシステムには適用されません)。それを切り捨てるには:_: > /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", ....)を呼び出します。