Czy mamy ręcznie usunąć zawartość / tmp?


26

Miałem wrażenie, że „stare” pliki /tmpbędą regularnie usuwane. Wydaje mi się jednak, że /tmpbędzie rosło tak długo, jak chce i nic nie zostanie usunięte. Niektórzy twierdzą, że lepiej zostawić w /tmpspokoju i usunąć jego zawartość tylko wtedy, gdy dysk się zapełni.

Moje pytanie brzmi: czy /tmpnaprawdę jest tak zaprojektowane, aby nie zadbać o siebie? Jakie są najlepsze praktyki?


1
zwykle /tmpjest czyszczony po ponownym uruchomieniu, ale zależy to od zamontowanego tam systemu plików. Co df -hmówi
etagenklo

Odpowiedzi:


27

Aby odpowiedzieć na pytania:

  • Czy /tmppowinien być opróżniany automatycznie: Tak
  • Czy mamy usuwać pliki /tmpregularnie i ręcznie: Nie , twój system się nimi zajmie.

Jeśli możesz zadać sobie pytanie:

  • Czy mogę usunąć pliki z /tmpdowolnego powodu (potrzebuję miejsca, chcę usunąć ślady itp.): To zależy , czytaj dalej .

System plików Hierarchy Standard (FHS) stwierdza :

Katalog / tmp musi zostać udostępniony programom wymagającym plików tymczasowych.

Programy nie mogą zakładać, że jakiekolwiek pliki lub katalogi w / tmp są zachowywane między wywołaniami programu.

/var/tmp/ma podobny cel , ale nie można go usunąć podczas ponownego uruchamiania.

Jest to nie gwarantuje , że /tmp/albo /var/tmp/są czyszczone regularnie. Może to zależeć od dystrybucji i ustawień, chociaż większość systemów od czasu do czasu wykonuje pewne porządki. Zobacz komentarz autorstwa mike.

Jeśli musisz usunąć plik w / tmp , najpierw sprawdź, czy plik jest w użyciu. Możesz to łatwo zrobić za pomocą:

lsof /tmp/file_to_delete

Jeśli masz do tego uprawnienia, pokaże to proces trzymający uchwyt tego pliku, taki jak nazwa procesu, PID i typ pliku. Aby pokazać naprawdę wszystkie procesy, dodaj sudolub uruchom jako użytkownik root .

lsof +D /tmp

pokaże Ci wszystkie pliki /tmpi katalogi poniżej ( +D), które są obecnie otwarte. Oczywiście nie powinieneś usuwać tych plików.

W rzeczywistości po usunięciu pliku, który jest nadal otwarty - jeśli masz do tego uprawnienia - staje się niedostępny z przestrzeni nazw systemu plików, ale nadal istnieje dla procesów, które mają dla niego otwarty uchwyt pliku. Po zamknięciu tego uchwytu plik nie jest już dostępny dla tego procesu, a jeśli żaden proces nie otworzył już pliku, jest on ostatecznie usuwany. Proces nie powinien zakładać, że plik przetrwa między kolejnymi openwywołaniami, ale programiści są niechlujni i nigdy nie wiadomo. Z tego powodu nie jest tak sprytnie usuwać pliki, które są nadal używane przez niektóre programy.


Ogólnie rzecz biorąc, jest to doskonała rada, szczególnie ostatni akapit. Ale to, czy system faktycznie czyści / tmp zależy od tego systemu. Na przykład w openSUSE nie robi tego , chyba że skonfigurujesz go na (z / etc / sysconfig lub przez YaST). Również osobiste ~ / tmp użytkowników (jeśli takie mają) nie są automatycznie usuwane.
Mike

Czy nadal można usuwać pliki, które otworzyły procesy? A to nie powoduje awarii programu? Gdzie zatem jest plik? Czy program może nadal współpracować z tym „otwartym, ale jednocześnie usuniętym” plikiem? Czy istnieje jakiś sposób utrudniający lub uniemożliwiający usunięcie pliku rm? Może coś w stylu blokady pliku?
CMCDragonkai

Pliki to zestawy danych w systemie plików, które są udostępniane w hierarchicznej przestrzeni nazw, poprzez ścieżkę i nazwę pliku. Plik może mieć wiele nazw (twarde łącza), a proces może mieć otwarty uchwyt pliku. Jeśli plik nie jest dostępny, to znaczy, gdy nie ma nazwy i nie ma otwartego uchwytu, jest usuwany. Zapobieganie usunięciu wykracza poza moją wiedzę, a IMO wykracza poza zakres tego pytania. Spróbuj wyszukać „obowiązkowe blokowanie”.
trapicki

[była duplikatem]
trapicki

4

Myślę, że to zależy od systemu operacyjnego. Wyobrażam sobie, że / tmp jest zwykle czyszczony przy ponownym uruchomieniu i rzeczywiście nie byłoby bezpieczne, aby system wyczyścił się w trakcie sesji, ponieważ nie będzie wiedział, które pliki są aktywne.

Jeśli jesteś odważny, możesz rzucić polecenie crontab, które usuwa pliki starsze niż określony wiek, ale może to powodować pewne problemy, jeśli usuwa pliki nadal używane. Możesz spróbować wykonać polecenie (jeszcze go nie próbowałem)

find / tmp -type f -ctime +10 -exec rm {} +

Co teoretycznie usunie wszystkie pliki w katalogu / tmp starsze niż 10 dni.


powinien chyba dodać -rdo tego
Steven Penny

1
Absolutnie NIE dodawaj do tego opcji -r - spowoduje to usunięcie lub usunięcie plików starszych niż 10 dni, jeśli istnieją w katalogach utworzonych ponad 10 dni temu. W rzeczywistości polecenie powinno prawdopodobnie znaleźć / tmp -type f -ctime +10 -exec rm {} +, aby ograniczyć wyszukiwanie do plików. (Użycie polecenia find spowoduje odtworzenie podkatalogów)
davidgo,

1

Katalogi / tmp i / var / tmp są czyszczone zgodnie z normalnym harmonogramem. To może zależeć od twojej dystrybucji. W moim systemie CentOS (klon RedHata) jest zaplanowane zadanie crona, aby uruchamiać tmpwatch , program czyszczący tmp dir, codziennie . Pliki w / var / tmp mogą pozostawać nieco dłużej niż pliki w / tmp /. Widziałem także skrypty, które przycinają / tmp (ale wyraźnie nie / var / tmp) podczas ponownego uruchamiania, wiedząc, że nic nie może trzymać tego pliku otwartego, ponieważ wszystkie procesy są nowe.

Tak, tak, / tmp ma obsługę od podstawowych skryptów. Nadal może wypełnić się poza tymi czasami konserwacji. Jeśli zdecydujesz się czyścić rzeczy ręcznie, najlepszą praktyką sysadmin jest ostrożność. Wiedza Sysadmin mówi o dowiązaniach symbolicznych w / tmp wskazujących na niezbędne pliki systemowe, które zostały usunięte, gdy sysadmins n00b uruchomił prosty findskrypt.


2
W Centos 7 i innych podobnych do RedHat systemach 7+ z systemem systemd czyszczenie jest skonfigurowane w /usr/lib/tmpfiles.d/tmp.conf. Jest to wywoływane przez systemd docelowy systemd-tmpfiles-clean.service.
shonky Linux użytkownik

1

W CentOS jest /etc/cron.dailywywoływane zadanie, tmpwatchktóre rekurencyjnie usuwa pliki, do których nie uzyskano dostępu przez określony czas. Zwykle służy do czyszczenia katalogów używanych do tymczasowego przechowywania miejsca, takiego jak / tmp.

To jest /etc/cron.daily/tmpwatchskrypt

#! / bin / sh
flagi = -umc
/ usr / sbin / tmpwatch "$ flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/ tmp / hsperfdata_ *' 10d / tmp
/ usr / sbin / tmpwatch "$ flags" 30d / var / tmp
dla d in / var / {cache / man, catman} / {cat?, X11R6 / cat ?, local / cat?}; robić
    if [-d "$ d"]; następnie
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    fi
gotowy

/tmp zawartość katalogu jest usuwana tylko podczas ponownego uruchamiania systemu, ponieważ uruchomiony proces może mieć dostęp do plików z tego katalogu.


0

Możesz usunąć zawartość z /tmp/; ale problem polega na tym, że jeśli masz usługę, która regularnie pisze /tmp/i usuwasz pliki, możesz spowodować awarię lub uszkodzenie usługi, dopóki nie zostanie ponownie uruchomiona.


0

FHS definiuje /tmpkatalogu jako „pliki tymczasowe (patrz również / var / tmp), często nie zachowały się między ponownym uruchomieniu systemu”, a /var/tmpjako „tymczasowe pliki mają być zachowane między restartów”.

Obecnie, /tmpponieważ system plików RAM (tmpfs) jest domyślnie (choć opcjonalny) w wielu dystrybucjach GNU / Linux, /tmpjest w zasadzie nietrwały.

(Prawdopodobnie) aplikacje powinny odpowiednio zarządzać swoimi plikami tymczasowymi, co moim zdaniem obejmuje ich usuwanie po zakończeniu ich używania i nie wymaga od administratorów planowania możliwych destrukcyjnych operacji usuwania.


Wiele programów może znacznie lepiej wyczyścić pliki, /tmpgdy są z nimi zrobione lub gdy wychodzą, ale nadal istnieje problem z plikami pozostawionymi /tmppo nieprawidłowym zakończeniu (awarii) programu.
Kevin Fegan

0

Jeśli korzystasz z Debiana (lub pochodnej takiej jak Ubuntu) powinieneś spojrzeć na plik / etc / default / rcS i dostosować TMPTIMEzmienną środowiskową. Z definicji, co znajduje się w / tmp, nie ma tu nic do roboty przy następnym restarcie.

polecam

  • za pomocą TMPTIMEzmiennej na serwerze
  • mount / tmp jako tmpfs (w pamięci RAM) na pulpicie (dla większej prędkości)

0

Dystrybucje są oczywiście różne, ale spodziewam się, że pliki tymczasowe będą automatycznie zarządzane przez system po wyjęciu z pudełka. Prawdopodobnie użyliby zadań cron lub usługi systemd-tmpfiles-clean. Jeśli martwisz się o miejsce na dysku, jest to przydatne polecenie, aby sprawdzić, ile miejsca zajmuje każdy folder główny:

du -hs /* | sort -h

Aby sprawdzić, czy system używa usługi systemd do zarządzania plikami tymczasowymi, możesz po prostu spróbować:

systemctl status systemd-tmpfiles-clean

Na dole zobaczysz coś takiego, co mówi, kiedy usługa była ostatnio uruchamiana:

systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static; vendor preset: disabled)
   Active: inactive (dead) since Wed 2018-07-18 15:43:36 IST; 18h ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)
  Process: 30495 ExecStart=/usr/bin/systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
 Main PID: 30495 (code=exited, status=0/SUCCESS)

Jul 18 15:43:36 host-name systemd[1]: Starting Cleanup of Temporary Directories...
Jul 18 15:43:36 host-name systemd[1]: Started Cleanup of Temporary Directories.

Pamiętaj, że ta usługa zostanie zakończona, gdy tylko zakończy się czyszczenie. Usługa timera jest odpowiedzialna za regularne uruchamianie. Możesz to sprawdzić za pomocą:

systemctl status systemd-tmpfiles-clean.timer

I powinieneś spodziewać się czegoś takiego:

systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
   Active: active (waiting) since Tue 2018-07-03 10:56:59 IST; 2 weeks 1 days ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)

Jul 03 10:56:59 host-name systemd[1]: Started Daily Cleanup of Temporary Directories.
Jul 03 10:56:59 host-name systemd[1]: Starting Daily Cleanup of Temporary Directories.

Jeśli spojrzysz ponownie na rzeczywistą usługę odpowiedzialną za czyszczenie plików, zobaczysz, że wszystko, co robi, to uruchomić:

/usr/bin/systemd-tmpfiles --clean

Możesz więc uruchomić to polecenie bezpośrednio lub wykonać to poprawnie, po prostu wykonaj:

systemctl start systemd-tmpfiles-clean

Które uruchomi odpowiednie polecenie dla twojego systemu. Należy jednak pamiętać, że nie jest to polecenie „usuń teraz wszystkie pliki tymczasowe”. Istnieje kilka plików konfiguracyjnych, które kontrolują to, co faktycznie zostanie usunięte, i kiedy aplikacje mogą indywidualnie konfigurować swoje pliki tymczasowe.

Jednym miejscem, w którym można znaleźć ogólną obsługę plików tymczasowych, mogą być /usr/lib/tmpfiles.d/tmp.confnastępujące odpowiednie linie:

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

Możesz zmienić te ustawienia na krótsze, jeśli w systemie zaczyna brakować miejsca, na przykład:

v /tmp 1777 root root 12h
v /var/tmp 1777 root root 1d

Aby mieć pewność, co robisz, man tmpfiles.dprzeczytaj instrukcję. Znów uważam, że przedstawione tutaj podejście jest odpowiednie dla CentOS (opartego na RedHat) i systemu Ubuntu, ale niewiele wiem o innych dystrybucjach.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.