Jak znaleźć duże pliki, które zostały usunięte, ale nadal są otwarte w aplikacji? Jak usunąć taki plik, nawet jeśli proces go otworzył?
Sytuacja polega na tym, że uruchamiamy proces, który wypełnia plik dziennika w niesamowitym tempie. Znam przyczynę i mogę to naprawić. Do tego czasu chciałbym rm lub opróżnić plik dziennika bez zamykania procesu.
Po prostu rm output.logusuwa tylko odniesienia do pliku, ale nadal zajmuje miejsce na dysku, dopóki proces się nie zakończy. Gorzej: po rming nie mogę teraz znaleźć, gdzie jest plik ani jak duży jest! Czy jest jakiś sposób, aby znaleźć plik i ewentualnie go opróżnić, nawet jeśli nadal jest otwarty w innym procesie?
Mam na myśli szczególnie systemy operacyjne oparte na Linuksie, takie jak Debian lub RHEL.
rmplików ed, które są nadal otwarte?
lsof | grep "(deleted)". Gdy nie będzie już żadnych procesów, w których usunięty plik jest otwarty, jądro zwolni bloki i-węzła i dysku. Procesy nie mają „programów obsługi”, za pomocą których można ich powiadomić, że otwarty, zasadniczo zablokowany plik, został usunięty z dysku.
lsof | grep '(deleted)'działa również w systemie Linux. W systemie Linux możesz zostać powiadomiony o usunięciu pliku (nawet pliki, które nie mają już żadnego wpisu w katalogu innym niż / proc / some-pid / fd) za pomocą mechanizmu inotify (zdarzenie IN_DELETE_SELF)
somefilei otworzyłem go w VIM, a następnie rmedytowałem w innym procesie bash. Następnie uruchamiam lsof | grep somefilei nie ma go tam, mimo że plik jest otwarty w VIM.
lsof -p <pid>aby wyświetlić listę jego otwartych plików i ich rozmiarów. Usunięty plik będzie miał(deleted)obok niego. Usunięte pliki zostaną prawdopodobnie połączone/proc/<pid>/fd/1. Nie wiem, jak sprawić, aby proces przestał zapisywać do swojego deskryptora pliku, nie przerywając go. Myślę, że to zależy od procesu.