web-dev-qa-db-ja.com

プロセスを強制終了せずに開いているファイルを閉じる

私はJava(そうJava ...)アプリケーションをCentOS 7で実行しています。しばらくすると、「削除された」ファイルがたくさんあり、気になります。

使用された削除済みファイル(問題ではない):

lsof | grep "(deleted)"

私はそれらを/ proc/pid/fd/...で見つけました、そして私の質問は、プロセスを殺すことなくそれらを殺す/削除する方法です(プロセスは24/7を実行する必要があります)。

Googleでgdbツールを使用できることを確認しましたが、使用方法がわかりません。私を助けてくれますか(ステップバイステップのマニュアルを書くだけです)?

あれば、他の提案もお待ちしています。

7
igor

_lsof -p $PID_を使用してファイル記述子を検索します(4番目の列)

root@blah:~# lsof -p 1737 | grep "(deleted)" Apache2 1737 root 6w REG 0,25 0 207401 (deleted)/var/log/Apache2/other_vhosts_access.log

4番目の列は6wで、ファイル記述子6を意味し、書き込み用に開かれました(w)。

次に:

gdb -p $PID p close($FD)

例えば:

gdb -p 1737 ..... (gdb) p close(6) $1 = 0 ... Quit anyway? (y or n) y Detaching from program: /usr/lib/Apache2/mpm-prefork/Apache2, process 1737

12
damolp

次のコマンドを使用して、削除されたファイルのファイル記述子を検索し、後でそれらを切り捨てることができます

find/proc/-mindepth 3 -maxdepth 3\-regex '/ proc/[1-9] [0-9] / fd/[1-9] [0-9]' -type l -lname '*(削除済み)'\-printf '%p\n%l\n' 2>/dev/null

0
kashminder