Najlepszy sposób na zwolnienie miejsca na dysku z usuniętych plików, które są otwarte

28

Cześć Mam wiele plików, które zostały usunięte, ale z jakiegoś powodu miejsca na dysku skojarzonego z usuniętymi plikami nie można wykorzystać, dopóki jawnie nie zabiję procesu dla pliku zajmującego miejsce na dysku

$ lsof /tmp/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)

Miejsce na dysku zajmowane przez usunięty plik powyżej powoduje problemy, takie jak przy próbie użycia klawisza Tab do autouzupełniania ścieżki do pliku Występuje błąd bash: cannot create temp file for here-document: No space left on device

Ale po uruchomieniu kill -9 1623przestrzeń dla tego PID zostaje zwolniona i nie pojawia się już błąd.

Moje pytania to:

  • dlaczego to miejsce nie jest natychmiast zwalniane przy pierwszym usuwaniu pliku?
  • jaki jest najlepszy sposób na odzyskanie przestrzeni plików związanej z usuniętymi plikami?

i daj mi znać każdą niewłaściwą terminologię, której użyłem, lub wszelkie inne istotne i stosowne informacje dotyczące tej sytuacji.

BryanK
źródło

Odpowiedzi:

26

W przypadku uników nazwy plików to tylko wskaźniki (i-węzły), które wskazują pamięć, w której znajduje się plik (którym może być dysk twardy lub nawet system plików oparty na pamięci RAM). Każdy plik rejestruje liczbę linków do niego: linkami może być nazwa pliku (liczba mnoga, jeśli istnieje wiele twardych linków do tego samego pliku), a także za każdym razem, gdy plik jest otwierany, proces faktycznie utrzymuje „link” do ta sama przestrzeń.

Przestrzeń jest fizycznie zwalniana tylko wtedy, gdy nie ma już linków (dlatego nie można się do niej dostać). To jedyny rozsądny wybór: gdy plik jest używany, nie ma znaczenia, czy ktoś inny nie może już uzyskać do niego dostępu: używasz go i dopóki go nie zamkniesz, nadal masz nad nim kontrolę - nawet nie zauważysz nazwy pliku zniknął, został przeniesiony lub cokolwiek innego. Jest to nawet wykorzystywane do plików tymczasowych: niektóre implementacje tworzą plik i natychmiast go odłączają, więc nie jest widoczny w systemie plików, ale proces, który go utworzył, używa go normalnie. Wtyczka Flash szczególnie lubi tę metodę: wszystkie pobrane pliki wideo są otwarte, ale system plików ich nie pokazuje.

Tak więc, odpowiedź na to pytanie jest taka, że ​​chociaż procesy nadal otwierają pliki, nie należy oczekiwać odzyskania miejsca. Nie jest uwolniony, jest aktywnie wykorzystywany. Jest to również jeden z powodów, dla których aplikacje powinny naprawdę zamykać pliki po zakończeniu ich używania. W normalnym użyciu nie powinieneś myśleć o tym miejscu jako wolnym, a to również nie powinno być zbyt powszechne - z wyjątkiem plików tymczasowych, które zostały rozłączone celowo, tak naprawdę nie powinno być żadnych plików, które byś chciał rozważ bycie nieużywanym, ale wciąż otwartym. Spróbuj sprawdzić, czy istnieje proces, który często to robi, i zastanów się, jak go używać, lub po prostu znajdź więcej miejsca.

orion
źródło
24

Pliki są usuwane z systemu plików, w którym usuwane są wszelkie odniesienia do tego i-węzła. Odwołanie może znajdować się na dysku (link w dowolnym katalogu) i .. z otwartych aplikacji. Jeśli usuniesz plik - usuniesz tylko odwołanie z dysku, ale - nadal będzie odwołanie z aplikacji.

Możesz „zwolnić” miejsce na dwa sposoby:

  1. jak wspomniano powyżej - możesz zabić aplikację, która otwiera plik.
  2. możesz ... obciąć plik. Nawet jeśli zostanie usunięty:

Jeśli znasz pid - zobacz, jakie pliki są otwarte przez ten pid: ls -l / proc / PID / fd widzisz tutaj linki takie jak:

undefine @ uml: ~ $ ls -l / proc / 18596 / fd
razem 0
lrwx ------ 1 undefine undefine 64 lut 1 00:06 0 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:06 1 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:05 2 -> / dev / pts / 30
lr-x ------ 1 undefine undefine 64 lut 1 00:06 3 -> / home / undefine / x (usunięty)
lr-x ------ 1 undefine undefine 64 lut 1 00:06 4 -> anon_inode: inotify

Jak widać - usunięto 3 fd. możesz go obciąć poleceniem (na przykład):

undefine @ uml: ~ $:> / proc / 18596 / fd / 3
undefine @ uml: ~ $ 

Pamiętaj, że jeśli aplikacja odczytuje z tego pliku - może być dla nich niebezpieczna. Ale - jeśli jest to tylko plik dziennika - możesz go bezpiecznie przyciąć.

niezdefiniować
źródło
zwróć uwagę, że po obcięciu pliku oryginalny proces, który go trzyma, może nadal dołączać się do końca (tam, gdzie oczekuje końca). wynikiem są pozornie ogromne, ale rzadkie pliki, które zajmują mniej miejsca na dysku (jeśli system plików obsługuje rzadkie pliki) i wciąż rosną!
törzsmókus
tak. Jeśli coś zapisuje do pliku, nastąpi to na dysku. Trudno tego uniknąć bez zatrzymywania aplikacji zapisującej na dysk;)
undefine
8

Jak powiedzieli inni, lsofmożna użyć do wyświetlenia listy wszystkich usuniętych plików, które nadal znajdują się na dysku z powodu otwartych deskryptorów plików. Może to być jednak bardzo długa lista. Oto polecenie, które wyświetla listę tych plików posortowanych według rosnącego rozmiaru w bajtach:

sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n

Może to być bardziej zwięzły sposób, ale powyższe polecenie działało dla mnie.

jcoffland
źródło
5

Miejsce nie jest natychmiast zwalniane, ponieważ uruchomiony proces nadal ma otwarty uchwyt pliku do właśnie usuniętego pliku. W końcu, jeśli proces nadal próbuje użyć pliku, prawdopodobnie tak naprawdę nie chcesz, aby jądro się go pozbyło (plik). Może to nieco zakłócić proces. Najlepszym (i tylko o ile wiem) sposobem na zwolnienie przestrzeni jest zrobienie tego, co zrobiłeś - zabicie procesu.

Jan
źródło
Prawdopodobnie lepszym zdaniem niż „po prostu jak to działa” jest „jeśli proces nadal korzysta z pliku Unix nie powinien próbować się go pozbyć”.
Bratchley,
Słuszna uwaga. Dodałem to do odpowiedzi.
John
-1

(Mennica 17.1)

TL; DR:

  • Sprawdź za pomocą sudo baobab(Disk Usage Analyzer).
  • Wyczyść rootśmieci użytkownika.

Kontekst

Utknąłem w coraz mniejszej przestrzeni podczas ciągłego usuwania plików. Zainstalowałem trash-clipakiet, aby opróżnić kosz, ale to nie pomogło. W końcu zauważyłem, że kiedy uruchomiłem baobab(Disk Usage Analyzer w GUI, przynajmniej na Mint 17.1), aby sprawdzić strukturę miejsca na dysku, dał ostrzeżenie, że niektóre foldery są niedostępne. Więc uruchomiłem to jako rootużywanie sudo baobab. To ujawniło problem. Wiele plików, które zostały usunięte, znajdowało się w koszu rootużytkownika, a nie mojego użytkownika. Dlatego nie mogłem zwolnić miejsca. Następnie po prostu opróżniłem kosz przy użyciu jako root ( sudo trash-cli) i cała moja przestrzeń została zwrócona.

Deleet
źródło
-1

Spróbuj użyć poniższego polecenia

lsof | grep deleted

a następnie zabij pid usuniętego pliku.

Sumit Tyagi
źródło
PO dotarł tak daleko; to nie odpowiada na ich pytania.
Jeff Schaller