Закрытие открытого файла без остановки процесса
У меня есть 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