Закрытие открытого файла без остановки процесса

20168
igor

У меня есть java (да, java ...) приложение, работающее на CentOS 7. Через некоторое время появляется множество «удаленных» файлов, которые меня беспокоят.

для удаленных файлов используется (не проблема):

lsof | grep "(deleted)" 

Я нашел их в / proc / pid / fd / ... и у меня вопрос, как я могу убить / удалить их, не убивая процесс (процесс должен запускаться 24/7).

Я видел в Google, что я могу использовать инструмент GDB, но я не знаю, как его использовать. Можете ли вы помочь мне (просто написать пошаговое руководство)?

Я буду рад услышать некоторые другие предложения, если у вас есть.

5
@ user20574 Если другая программа писала в файл и потеряла дескриптор, очевидно, что это приведет к повреждению файла. Glimpse 5 лет назад 0
@ Хорошо, да, но только для файла, который вы принудительно закрыли. Не очевидно, что это также повредит * другие файлы в случайном порядке *. user20574 5 лет назад 0

1 ответ на вопрос

7
damolp

использовать 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

СПАСИБО, наконец-то хороший рабочий простой ответ! Кстати, все мои процессы имеют 'x'u в 4-м столбце. Что значит "и"? igor 8 лет назад 0
`u` означает, что файловый дескриптор открыт для чтения и записи damolp 8 лет назад 0

Похожие вопросы