Zadano mi to pytanie w dwóch kolejnych wywiadach, ale po kilku badaniach i sprawdzeniu z różnymi administratorami systemów nie otrzymałem dobrej odpowiedzi. Zastanawiam się, czy ktoś może mi tutaj pomóc.
Na serwerze brakuje miejsca na dysku. Zauważasz bardzo duży plik dziennika i stwierdzasz, że można go bezpiecznie usunąć. Usuwasz plik, ale dysk nadal pokazuje, że jest pełny. Co by to spowodowało i jak temu zaradzić? A jak odkryjesz, który proces zapisuje ten ogromny plik dziennika?
linux
shell
log-files
disk-space-utilization
ewwhite
źródło
źródło
Odpowiedzi:
To jest często zadawane pytanie podczas wywiadu i sytuacja, która pojawia się w różnych środowiskach produkcyjnych.
Pozycje katalogu pliku zostały usunięte, ale proces rejestrowania jest nadal uruchomiony. Miejsce nie zostanie odzyskane przez system operacyjny, dopóki wszystkie uchwyty plików nie zostaną zamknięte (np. Proces został zabity) i wszystkie wpisy katalogu zostaną usunięte. Aby znaleźć proces zapisujący do pliku, musisz użyć
lsof
polecenia.Inną częścią pytania może być czasem „jak wyczyścić plik, do którego jest zapisywany, nie zabijając procesu?” Idealnie byłoby „wyzerować” lub „skrócić” plik dziennika za pomocą czegoś podobnego
: > /var/log/logfile
zamiast usuwania pliku.źródło
fuser
.no-clobber
ustawiłeś, spróbuj:>| /var/log/logfile
df
Mówi,du
że masz za mało miejsca, mówi , że prawie nie używasz żadnego. Co to powoduje i dlaczego dwa narzędzia się nie zgadzają?”> /var/log/file
zwolnieniu miejsca na dysku nadal wynosi 100%? Plik dziennika wydaje się być pusty ... ale dopiero po ponownym uruchomieniu programu zapisującego ten plik dziennika przestrzeń jest odzyskiwana. Czy istnieje sposób na odzyskanie miejsca na dysku bez ponownego uruchamiania programu?Istnieje jeszcze inny link do pliku (twardy link lub otwarty uchwyt pliku). Usunięcie pliku usuwa tylko pozycję katalogu; dane pliku i i-węzeł zawieszają się, dopóki nie zostanie usunięte ostatnie odniesienie do niego.
Jest to dość powszechna praktyka dla usługi, aby utworzyć plik tymczasowy i natychmiast go usunąć, zachowując plik otwarty. Powoduje to utworzenie pliku na dysku, ale gwarantuje, że plik zostanie usunięty, jeśli proces zakończy się nienormalnie, a także zapobiegnie przypadkowemu wtargnięciu innych procesów do pliku. MySQL robi to na przykład dla wszystkich tabel tymczasowych na dysku. Złośliwe oprogramowanie często stosuje podobną taktykę do ukrywania swoich plików.
W systemie Linux możesz wygodnie uzyskać dostęp do tych usuniętych plików jako
/proc/<pid>/fd/<filenumber>
.źródło
Nie jestem sysadminem, ale z tego, co zebrałem na Unix.SE, system Linux nie usunie pliku (oznaczy miejsce jako wolne / wielokrotnego użytku) po jego rozłączeniu, dopóki wszystkie deskryptory plików wskazujące został zamknięty. Aby odpowiedzieć na pierwszą część, miejsce nie jest jeszcze wolne, ponieważ proces wciąż go odczytuje. Aby odpowiedzieć na drugie pytanie, możesz sprawdzić, z którym procesem jest używany plik
lsof
.źródło
Jedna z alternatywnych odpowiedzi poza oczywistą odpowiedzią na twardy link / otwarty plik: ten plik jest (bardzo) rzadkim plikiem, takim jak
/var/log/lastlog
RHEL, który tak naprawdę nie zajmował tyle miejsca. Usunięcie go miało bardzo niewielki wpływ, więc musisz spojrzeć na następny największy plik.źródło
Jeśli proces zapisujący plik jest rootem, zapisze się w obszarze plików zarezerwowanym przez administratora. System plików ma to miejsce, aby system działał na wypadek, gdyby zadanie użytkownika zapełniło dysk. Ta przestrzeń (imho domyślnie 5%) jest niewidoczna dla wielu narzędzi.
lsof może ci pokazać, który proces zablokował plik, ergo pisze do niego.
źródło
Oprócz otwierania pliku przez proces, drugim przypadkiem jest system plików obsługujący migawki takie jak
btrfs
lubZFS
.Na przykład robisz migawkę z tym ogromnym plikiem dziennika. Jeśli usuniesz plik teraz, usuniesz tylko deltę. I delta jest usuwana tylko wtedy, gdy plik nie jest używany.
Zobacz też:
https://superuser.com/questions/863588/how-to-delete-a-file-in-all-snapshots-on-a-btrfs-system
ZFS: Usuwasz pliki z migawek?
Trzecim przypadkiem jest system plików, który obsługuje usuwanie duplikatów na poziomie bloku, a większość plików jest identyczna z innym plikiem. Nie oczekuję, że tak się stanie w przypadku dziennika, chyba że masz kontener lub maszynę wirtualną, która wysyła dzienniki do kontenera syslog lub maszyny wirtualnej, które współużytkują ten sam system FS, dzięki czemu zawartość dziennika jest identyczna.
źródło