Как найти большие файлы, которые были удалены, но все еще открыты в приложении? Как удалить такой файл, даже если процесс открыт?
Ситуация такова, что мы запускаем процесс, который заполняет файл журнала с невероятной скоростью. Я знаю причину, и я могу это исправить. До тех пор я хотел бы rm или очистить файл журнала без остановки процесса.
Простое выполнение rm output.log
удаляет только ссылки на файл, но оно продолжает занимать место на диске, пока процесс не будет завершен. Хуже того, после того, rm
как я не смог найти файл или его размер! Есть ли способ найти файл и, возможно, очистить его, даже если он еще открыт в другом процессе?
Я имею в виду операционные системы на основе Linux, такие как Debian или RHEL.
rm
файлов ed, которые все еще открыты?
lsof | grep "(deleted)"
. Когда больше нет процессов, удерживающих открытый файл открытым, ядро освобождает блоки inode и disk. Процессы не имеют «обработчиков», с помощью которых они могут получать уведомления о том, что открытый, по существу заблокированный файл был удален с диска.
lsof | grep '(deleted)'
работает и в Linux. В Linux вы можете получать уведомления об удалении файлов (даже файлы, которые уже не имеют записей в каком-либо каталоге, кроме / proc / some-pid / fd) с помощью механизма inotify (событие IN_DELETE_SELF)
somefile
и открыл его в VIM, а затем rm
редактировал в другом процессе bash. Затем я запускаю, lsof | grep somefile
и его там нет, хотя файл открыт в VIM.
lsof -p <pid>
для отображения открытых файлов и их размеров. Удаленный файл будет иметь(deleted)
рядом с ним. Удаленный файл будет связан,/proc/<pid>/fd/1
вероятно, в. Я не знаю, как заставить процесс прекратить запись в свой файловый дескриптор, не завершив его. Я думаю, что это будет зависеть от процесса.