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

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

我在 CentOS 7 上运行着 java(是的,java......)应用程序。过了一段时间,出现了许多令我困扰的“已删除”文件。

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

lsof | grep "(deleted)"

我在 /proc/pid/fd/... 中找到了它们,我的问题是如何在不终止进程的情况下终止/删除它们(进程必须全天候运行)。

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

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

答案1

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

第四列是 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

答案2

使用以下命令查找已删除文件的文件描述符,然后可以截断它们

查找 /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

相关内容