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

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

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

lsof | grep "(deleted)"

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

Я видел в 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

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

Используйте следующую команду, чтобы найти дескрипторы файлов удаленных файлов, и вы можете обрезать их впоследствии

find / 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

Другие вопросы по тегам