Jak czyści się katalog / tmp?

300

Jak /tmpsprzątany jest katalog? Czy to jest automatyczne? Jeśli tak, to jak często jest sprzątany?

Olivier Lalonde
źródło
15
Moje pliki tymczasowe nigdy nie są zapisywane na dysku. Są zapisywane na dysku RAM. Włożyłem tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0/ etc / fstab.
Anonimowy
Powiązane: serverfault.com/questions/377348/when-does-tmp-get-cleared/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

192

Uwaga! Ta odpowiedź jest nieaktualna, ponieważ przynajmniej Ubuntu 14.04. Zobacz inne odpowiedzi na bieżącą sytuację, a jeśli okażą się poprawne, głosuj z wściekłością. Prześlij także komentarz, aby umieścić tutaj link do aktualnej poprawnej odpowiedzi.

14.04 patrz https://askubuntu.com/a/759048/1366

16.10 patrz https://askubuntu.com/a/857154/453746


Stara odpowiedź z 2011 r .:

Czyszczenie /tmpodbywa się za pomocą skryptu upstart /etc/init/mounted-tmp.conf. Skrypt jest uruchamiany przy każdym uruchomieniu /tmp. Praktycznie oznacza to przy każdym rozruchu.

Skrypt wykonuje mniej więcej następujące czynności: jeśli plik w /tmpstarszym wieku niż kilka $TMPTIMEdni, zostanie usunięty.

Domyślna wartość $TMPTIMEto 0, co oznacza, że ​​każdy plik i katalog w nim /tmpzostanie usunięty. $TMPTIMEjest zmienną środowiskową zdefiniowaną w /etc/default/rcS.

lesmana
źródło
Nie dotyczy to już 14.04 (skrypt już nie istnieje).
Martin Schröder,
@Martin Schröder - skrypt istnieje w moim systemie i jest to czysta instalacja 14.04 i tmpreaper nie istnieje!
Lance Holland
Używam teraz arch Linux, więc nie mogę zweryfikować. Przepraszam. Proszę, zweryfikuj to i skomentuj lub edytuj moją odpowiedź.
lesmana
4
w Ubuntu 16.04 tmpreaper jest porzucony jako niezabezpieczony, patrz: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha
1
Nie. W Ubuntu 16.04 jest on po prostu zastępowany przez systemowy mechanizm. Przeczytaj ten dokument, a zobaczysz wyjaśnienie, dlaczego analiza bezpieczeństwa, która twierdzi, że jest niepewna, jest wadliwa.
JdeBP
141

Katalog jest domyślnie czyszczony przy każdym uruchomieniu, ponieważ TMPTIMEdomyślnie jest równy 0.

Tutaj możesz zmienić czas w następującym pliku:

/etc/default/rcS

TMPTIME mówi, jak często tmp dir powinien być usuwany w ciągu kilku dni

Max Ruf
źródło
9
Czyszczenie przy każdym uruchomieniu nie jest idealne dla komputera, który nigdy nie uruchamia się ponownie, takiego jak serwer. Mam ponad 500 000 plików zajmujących miejsce 5 Gb w moim / tmp, ponieważ mój serwer ma 378 dni bezawaryjności. Nie chcę go ponownie uruchamiać, po prostu dlatego, że wyczyszczenie tych plików przy ponownym uruchomieniu zajmuje wiele godzin.
rjmunro
10
W twoim przypadku powinieneś dać tmpreaperszansę.
qbi
1
Zadanie CRON może to łatwo rozwiązać.
Ken Sharp
tmpwatchPowinno też być odpowiednim narzędziem.
ArekBulski
1
Wygląda na to, że Ubuntu / systemd już zapewnia rozwiązanie. Powiedziałbym więcej, ale .... systemd.
Ken Sharp
65

Chociaż /tmpfolder nie jest miejscem do przechowywania plików przez dłuższy czas, czasami chcesz zachować trochę więcej czasu niż przy następnym uruchomieniu , co jest domyślne w systemach Ubuntu. Wiem, że raz lub dwa pobrałem coś /tmppodczas testowania, po wprowadzeniu zmian uruchomiłem ponownie, a następnie ponownie straciłem oryginalne dane. Można to zmienić, jeśli chcesz /tmptrochę dłużej przechowywać swoje pliki.

Zmiana /tmpczęstotliwości czyszczenia

Domyślne ustawienie, które nakazuje systemowi wyczyścić się /tmpprzy ponownym uruchomieniu, znajduje się w /etc/default/rcSpliku. Wartość, na którą będziemy patrzeć, to TMPTIME.

Obecna wartość TMPTIME=0mówi usuń pliki przy ponownym uruchomieniu, pomimo wieku pliku. Zmiana tej wartości na inną (dodatnią) liczbę spowoduje zmianę liczby dni, przez które plik może przetrwać /tmp.

TMPTIME=7

To ustawienie pozwoli na pozostanie plików do ukończenia /tmptygodnia, a następnie usunie je przy następnym uruchomieniu. Liczba ujemna ( TMPTIME=-1) informuje system, aby nigdy niczego nie usuwał /tmp. Prawdopodobnie nie jest to coś, czego chcesz, ale jest dostępne.

hhlp
źródło
1
dobre wytłumaczenie. Ale w którym skrypcie znajduje się polecenie czyszczenia? Widziałem /etc/init/mounted-temp.conf, ale ma linię, start on mounted MOUNTPOINT=/tmpktóra sprawia, że ​​uważam, że nie dotyczy.
enzotib
7
Jeśli nie chcesz, aby plik był usuwany automatycznie, wstaw go /var/tmpzamiast /tmp.
Gilles,
1
Przydatne jest także przechowywanie plików, których nie chcesz stracić (renderowane klatki wideo), gdy komputer ulega awarii, prawdopodobnie z powodu OOM. Oczywiście lepszym rozwiązaniem byłoby rozwiązanie problemu. :-)
Ken Sharp
Czy można to zrobić w Cygwin?
CMCDragonkai
46

Sprawdzam to na Ubuntu 16.10. Mogę poświadczyć, że edycja / etc / default / rcS nie ma już żadnego efektu, a pliki w tmp są usuwane przez restart, bez względu na to, co umieścisz w tym pliku. Jak wspominają inni, tmpreaper nie jest już używany.

Myślę, że właściwą odpowiedzią jest to, że Ubuntu 16.10 ma nową konfigurację. Istnieje folder /etc/tmpfiles.d, udokumentowany na stronie podręcznika „tmpfiles.d”. W tym folderze należy umieścić plik konfiguracyjny, aby kontrolować, czy / tmp ma zostać skasowany. Oto, co robię, aby zatrzymać ponowne uruchamianie w celu usunięcia plików w / tmp, chyba że mają one 20 dni:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

Zamień „20d” na „-”, jeśli nigdy nie chcesz, aby pliki były usuwane. To jest mój najlepszy wysiłek, że strona podręcznika jest prawie nieprzenikniona ze szczegółami.

Zaletą nowej konfiguracji jest to, że narzędzie do czyszczenia plików może nadal działać, nawet jeśli system nie zostanie ponownie uruchomiony (jak w przypadku zawsze na serwerze). To chyba duży plus.

pauljohn32
źródło
5
man tmpfiles.d
Martin Schröder
Odkryłem, że możesz zachować oryginalne uprawnienia do plików i właściciela, używając łączników:d /tmp/ - - - 20d
Dave Yarwood
2
Warto również zauważyć: możesz przetestować konfigurację, uruchamiając zadanie czyszczenia ręcznie:systemctl start systemd-tmpfiles-clean
Dave Yarwood
@ pauljohn32 czy dotyczy to również wersji po 16.10?
kapad
3
@kapad: Właśnie sprawdziłem, że działa to również na Ubuntu 18.04.
Gene Vincent,
26

W Ubuntu 14.04 odbywa się to przez tmpreaper, który jest wywoływany codziennie przez cron (from /etc/cron.daily). Program można skonfigurować za pomocą /etc/default/rcSi /etc/tmpreaper.conf.

Martin Schröder
źródło
w moim systemie tmpreaper nie był w /etc/cron.daily - ale udało mi się go zainstalować za pomocą apt-get
Joe Germuska
10

Przed 14.04:

Jest czyszczony przy każdym ponownym uruchomieniu.

Utku Demir
źródło
Pojawia się z wersją 14.04+, używa tylko tmpreaper, a nie skryptu FWIW „na boot”
rogerdpack,
Wszystkie moje systemy 14.04 czyszczą się przy ponownym uruchomieniu. Nigdy nawet o tym nie słyszałem tmpreaper.
Ken Sharp
co jeśli nigdy nie uruchomisz ponownie systemu?
phuclv
7

W systemdUbuntu (15.10 i nowszych) odbywa się to przez systemd, przy użyciu systemd-tmpfiles-cleanusługi i timera:

$ systemctl cat systemd-tmpfiles-clean.service 
# /lib/systemd/system/systemd-tmpfiles-clean.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs.target time-sync.target
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/systemd-tmpfiles --clean
IOSchedulingClass=idle

I

$ systemctl cat systemd-tmpfiles-clean.timer  
# /lib/systemd/system/systemd-tmpfiles-clean.timer
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Więc systemd-tmpfiles-cleandziała przy wyłączeniu, a raz dziennie inaczej. Pliki, które czyści, można rozszerzyć, używając /etc/tmpfiles.dwspomnianej w innej odpowiedzi .

Możesz sam zmienić zachowanie timera za pomocą systemctl edit systemd-tmpfiles-clean.timeri różnych Timeropcji konfiguracji systemowej (patrz man 5 systemd.timer).

muru
źródło
Zmieniłem licznik na 20 minut i widzę, że polecenie statusu pokazuje, że faktycznie używa konfiguracji 20 minut. ale mój problem polega na tym, że /tmpwciąż nie posprzątałem. i muszę to wyczyścić. nawet ręczne uruchomienie sudo systemctl start systemd-tmpfiles-cleannie załatwia sprawy. Jakieś pomysły dlaczego?
user2932688
5

Na jednym z naszych serwerów z Ubuntu mamy skrypt do usuwania plików z katalogu / tmp i działa on co noc.

Skrypt to:

#!/bin/sh
# Clean file and dirs more than 3 days old in /tmp nightly

/usr/bin/find /tmp -type f -atime +2 -mtime +2  |xargs  /bin/rm -f &&

/usr/bin/find /tmp -type d -mtime +2 -exec /bin/rm -rf '{}' \; &&

/usr/bin/find /tmp -type l -ctime +2 |xargs /bin/rm -f &&

/usr/bin/find -L /tmp -mtime +2 -print -exec rm -f {} \;

Po prostu zapisz powyższą zawartość do pliku chmod 775 i stwórz wpis crona, aby go uruchomić. Ponieważ jest to serwer sieciowy, nie chcemy go ponownie uruchamiać z oczywistych powodów.

Paweł
źródło
6
Lepiej skorzystaj z tmpwatch .
poolie
9
Ostatnia linia jest wyjątkowo niebezpieczna. Zwykle każdy jest w stanie biec, ln -s /usr /tmp/kabooma nawet ln -s /* /tmp/...
Daniel Alder