Kiedy usuwasz plik, tak naprawdę usuwasz link do pliku (do i-węzła). Jeśli ktoś już ma ten plik otwarty, może zachować deskryptor pliku, który ma. Plik pozostaje na dysku, zajmuje miejsce i można go zapisać i odczytać, jeśli masz do niego dostęp.
unlink
Funkcja jest zdefiniowana z tego zachowania przez POSIX:
Gdy liczba linków do pliku osiągnie wartość 0 i żaden proces nie otworzy pliku, przestrzeń zajmowana przez plik zostanie zwolniona, a plik nie będzie już dostępny. Jeśli jeden lub więcej procesów ma otwarty plik po usunięciu ostatniego linku, link zostanie usunięty przed powrotem unlink (), ale usunięcie zawartości pliku zostanie odroczone do momentu zamknięcia wszystkich odniesień do pliku .
Ta rada z powodu tego zachowania. Demon otworzy plik i nie zauważy, że został usunięty (chyba że monitorował go konkretnie, co jest rzadkie). Będzie beztrosko zapisywać do istniejącego deskryptora pliku, który ma: będziesz nadal zajmować (więcej) miejsca na dysku, ale nie będziesz w stanie zobaczyć żadnej wiadomości, którą pisze, więc naprawdę jesteś w najgorszym obu światów. Jeśli zamiast tego skrócisz plik do zera, miejsce zostanie natychmiast zwolnione, a wszelkie nowe wiadomości zostaną dołączone na nowym końcu pliku, gdzie możesz je zobaczyć.
Ostatecznie, gdy demon zakończy działanie lub close
s plik , przestrzeń zostanie zwolniona. Nikt nowy nie może otworzyć pliku w międzyczasie (inaczej niż poprzez specyficzne dla systemu interfejsy odblaskowe, takie jak Linux/proc/x/fd/...
). Gwarantuje to również, że:
Jeśli liczba odsyłaczy pliku wynosi 0, gdy wszystkie deskryptory pliku skojarzone z plikiem zostaną zamknięte, przestrzeń zajmowana przez plik zostanie zwolniona, a plik nie będzie już dostępny.
Dzięki temu nie tracisz na stałe miejsca na dysku, ale nic nie zyskujesz poprzez usunięcie pliku i tracisz dostęp do nowych wiadomości.
/proc/x/fd/y
? Czy spowodowałoby to, że proces nie zapisuje się do deskryptora pliku, czy jest to nielegalna operacja?/proc/*/fd/*
to dowiązania symboliczne do prawdziwych plików, więc usunięcie ich nie spowoduje usunięcia pliku. Proponuję eksperymentować :) (oczywiście nie w systemie produkcyjnym!)rm
nietrzymanie moczu w środku/proc
lub/sys
bez uprzedzenia przez system.Dokładnie.
Pliki są trójdzielne.
/home/user/personal_file
, które działają jak uchwyty, przez które można wykorzystać plik, modyfikować jego zawartość, zmienić jego metadanych, itdPo otwarciu pliku podajesz ścieżkę do systemu operacyjnego, a on zwraca uchwyt bezpośrednio do i-węzła. Za pomocą tego uchwytu, zwanego deskryptorem pliku, można manipulować plikiem w dowolny sposób (lub przynajmniej w zakresie dozwolonym przez system operacyjny).
Nigdy nie możesz bezpośrednio usunąć i-węzła, musisz podać ścieżkę do systemu operacyjnego, aby wymagać usunięcia. Tak więc, jeśli chcesz usunąć plik, usuwasz tylko pozycję katalogu. Jeśli plik ma inne wpisy katalogu, będzie nadal dostępny, a nawet jeśli nie, jego i-węzeł nie zostanie usunięty, dopóki nadal wskazują na niego deskryptory plików. Odpowiedź @ MichaelHomer jest bardziej techniczna i bardziej szczegółowa na ten temat.
źródło
Pozostałe 2 odpowiedzi wyjaśnić kwestię dobrze - plik nie dostać „skasowany”, dopóki wszystkie linki katalog do niej i wszystkie otwarte deskryptory plik, aby go nie ma.
Aby tego uniknąć, warto używać tego nawyku
zamiast
ponieważ to po prostu resetuje zawartość do 0 bajtów zamiast ją usuwać, i nadal możesz zobaczyć, co jest do niej napisane.
Jeśli usunąłeś plik i korzystasz z systemu Linux, na którym znajduje się system plików / proc / fd, nadal możesz go używać
aby wyzerować zawartość pliku (zakładając, że 12345 jest twoim identyfikatorem procesu, a 3 to numer fd dużego pliku). Może to uratować życie, jeśli dysk jest pełny i z jakiegoś powodu nie możesz zabić procesu zapisywania pliku dziennika.
źródło
> /var/log/bigfile
usuwa istniejące dane z pliku, ale nie powstrzymuje programów przed zapisem. Jest bardzo niewiele okoliczności, w których jest to właściwe. Powiedziałbym, że to zły nawyk. Jeśli chcesz usunąć plik, użyjrm
. Jeśli chcesz zatrzymać programy, które tam piszą, zabij je lub w inny sposób spraw, aby przestały pisać, przed usunięciem lub po nim.syslogd
zapełniają się/var/log/messages
,> /var/log/messages
jest znacznie lepszą opcją niż zabijaniesyslogd
. Oczywiście nie powinno to powstrzymywać Cię przed analizowaniem, na czym polega problem.