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.log
usuwa tylko odniesienia do pliku, ale nadal zajmuje miejsce na dysku, dopóki proces się nie zakończy. Gorzej: po rm
ing 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.
rm
plikó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)
somefile
i otworzyłem go w VIM, a następnie rm
edytowałem w innym procesie bash. Następnie uruchamiam lsof | grep somefile
i 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.