关闭打开的文件而不终止进程

igo*_*gor 11 linux java process gdb lsof

我在 CentOS 7 上运行了 java(yeah java...) 应用程序。过了一会儿,有很多“已删除”的文件困扰着我。

对于使用的已删除文件(不是问题):

lsof | grep "(deleted)"
Run Code Online (Sandbox Code Playgroud)

我在 /proc/pid/fd/... 中找到了它们,我的问题是如何在不杀死进程的情况下杀死/删除它们(进程必须 24/7 运行)。

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

如果您有其他建议,我很乐意听取。

小智 18

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