Як можна знайти великі файли, які були видалені, але все ще відкриті в програмі? Як можна видалити такий файл, навіть якщо процес відкритий?
Ситуація полягає в тому, що ми запускаємо процес, який заповнює файл журналу з надзвичайною швидкістю. Я знаю причину, і можу її виправити. До цього часу я хотів би вимкнути або очистити файл журналу, не вимикаючи процес.
Просто виконайте rm output.logвилучення лише посилань на файл, але він продовжує займати місце на диску до завершення процесу. Гірше: після rming я тепер не можу знайти, де файл чи наскільки він великий! Чи є якийсь спосіб знайти файл і, можливо, випорожнити його, хоча він все ще відкритий в іншому процесі?
Я конкретно маю на увазі операційні системи на базі Linux, такі як Debian або RHEL.
rmредакторів, які ще відкриті?
lsof | grep "(deleted)". Коли більше не буде процесів, що містять видалений файл відкритим, ядро звільнить блоки inode та диска. У процесах немає "обробників", за допомогою яких вони можуть отримувати повідомлення про те, що відкритий, по суті заблокований файл, видалено з диска.
lsof | grep '(deleted)'працює і в Linux. В Linux, ви можете отримувати сповіщення про видалення файлів (навіть файли, які вже не мають жодної записи, крім / proc / some-pid / fd), за допомогою механізму inotify (IN_DELETE_SELF)
somefileі відкрив його в VIM, потім rmвідредагував його в іншому баш-процесі. Потім я запускаю, lsof | grep somefileі його немає там, хоча файл відкритий у VIM.
lsof -p <pid>для переліку його відкритих файлів та їх розмірів. У видаленому файлі буде(deleted)поруч із ним. Видалений файл буде пов’язаний,/proc/<pid>/fd/1мабуть, Я не знаю, як зробити так, щоб процес припинив писати у його дескриптор файлів, не припиняючи його. Я думаю, це залежатиме від процесу.