Як можна знайти великі файли, які були видалені, але все ще відкриті в програмі? Як можна видалити такий файл, навіть якщо процес відкритий?
Ситуація полягає в тому, що ми запускаємо процес, який заповнює файл журналу з надзвичайною швидкістю. Я знаю причину, і можу її виправити. До цього часу я хотів би вимкнути або очистити файл журналу, не вимикаючи процес.
Просто виконайте rm output.log
вилучення лише посилань на файл, але він продовжує займати місце на диску до завершення процесу. Гірше: після rm
ing я тепер не можу знайти, де файл чи наскільки він великий! Чи є якийсь спосіб знайти файл і, можливо, випорожнити його, хоча він все ще відкритий в іншому процесі?
Я конкретно маю на увазі операційні системи на базі 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
мабуть, Я не знаю, як зробити так, щоб процес припинив писати у його дескриптор файлів, не припиняючи його. Я думаю, це залежатиме від процесу.