題 關閉打開的文件而不會終止進程


我在CentOS 7上運行java(是的java ...)應用程序。 過了一會兒,有很多“刪除”的文件讓我煩惱。

對於已刪除的文件(不是問題):

lsof | grep "(deleted)"

我在/ proc / pid / fd / ...中找到了它們,我的問題是如何在不殺死進程的情況下殺死/刪除它們(進程必須全天候運行)。

我在google上看到我可以使用gdb工具,但我不知道如何使用它。 你能幫幫我(只是寫一步一步的手冊)?

如果你有,我會很樂意聽到其他一些建議。


5
2017-08-27 13:09


起源


@ user20574如果另一個程序正在寫入該文件,並且它丟失了它的句柄,很明顯會導致文件損壞。 - Glimpse
@Glimpse是的,但只對你強制關閉的文件。它也不會腐敗,這並不明顯 其他文件隨機。 - user20574


答案:


使用 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


7
2017-08-27 15:20



謝謝,最後一個好的工作簡單的答案!!順便說一句,我的所有流程都在第四列中有'x'u。 “你”是什麼意思? - igor
u 表示文件描述符是打開讀寫的 - damolp