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


5

我在CentOS 7上运行java(是的java ...)应用程序。 过了一会儿,有很多“删除”的文件让我烦恼。

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

lsof | grep "(deleted)"

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

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

如果你有,我会很乐意听到其他一些建议。


@ user20574如果另一个程序正在写入该文件,并且它丢失了它的句柄,很明显会导致文件损坏。
Glimpse

@Glimpse是的,但只对你强制关闭的文件。它也不会腐败,这并不明显 其他文件随机
user20574

Answers:


7

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


谢谢,最后一个好的工作简单的答案!!顺便说一句,我的所有流程都在第4列中有'x'u。 “你”是什么意思?
igor

u 表示文件描述符是打开读写的
damolp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.