Jak bezpiecznie wyczyścić folder tmp w systemie Linux

15

Używam pamięci RAM dla mojego tmpfs / tmp, 2 GB, a dokładnie. Zwykle to wystarcza, ale czasami procesy tworzą tam pliki i nie czyszczą się po sobie. Może się to zdarzyć, jeśli się rozbiją. Muszę usunąć te osierocone pliki tmp, w przeciwnym razie w przyszłym procesie zabraknie miejsca na / tmp.

Jak mogę bezpiecznie wyrzucać śmieci / tmp? Niektóre osoby robią to, sprawdzając znacznik czasu ostatniej modyfikacji, ale takie podejście jest niebezpieczne, ponieważ mogą istnieć długotrwałe procesy, które nadal potrzebują tych plików. Bezpieczniejszym podejściem jest połączenie warunku znacznika czasu ostatniej modyfikacji z warunkiem, że żaden proces nie ma dojścia do pliku. Czy istnieje program / skrypt / itp., Który ucieleśnia to podejście lub inne bezpieczne podejście?

Nawiasem mówiąc, czy Linux / Unix pozwala na tryb otwierania pliku z tworzeniem, w którym utworzony plik jest usuwany po zakończeniu procesu tworzenia, nawet jeśli jest to awaria?

Syncopated
źródło
Sprawdź, czy możesz użyć tmpfs zamiast / tmp: kernel.org/doc/Documentation/filesystems/tmpfs.txt
ott--
Powiązane: askubuntu.com/questions/380238/how-to-clean-tmp
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

15

Możesz spróbować czegoś takiego:

find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'

find służy do wyszukiwania plików spełniających określone kryteria.

  • -mtime +7 wybiera tylko pliki starsze niż 7 dni (możesz użyć dowolnej innej wartości)
  • -exec fuser -s {} ';'wywołuje fuser w trybie cichym dla każdego pliku, który spełnia kryteria starości. fuser zwraca 0 (= prawda) dla każdego pliku, do którego uzyskano dostęp w tej chwili i 1 (= fałsz) dla plików, które nie były dostępne. Ponieważ interesują nas tylko te bez dostępu, stawiamy -notprzed tym-exec
  • -exec echo {} ';'po prostu drukuje wszystkie nazwy plików spełniające kryteria. możesz -exec rm {} ';'zamiast tego użyć tutaj, ale ponieważ może to usunąć niektóre nadal używane pliki, myślę, że bezpieczniej jest najpierw wykonać proste echo.
  • edycja: Możesz dodać coś takiego -name 'foo*.bar'lub -uid 123ograniczyć efekty czyszczenia do określonych wzorców plików lub identyfikatorów użytkowników, aby uniknąć przypadkowych efektów.

Do ostatniego punktu: zastanów się, że mogą istnieć pliki, które są zapisywane tylko raz (np. Przy starcie systemu), ale często czytane (np. Dowolny plik cookie sesji X). Dlatego zalecamy dodanie sprawdzania nazw, aby wpływać tylko na pliki utworzone przez wadliwe programy.

edit2: Do twojego ostatniego pytania: Plik nie zostanie usunięty z dysku, dopóki żaden proces nie będzie miał otwartego uchwytu (przynajmniej dla rodzimych systemów plików Linux). Problem polega na tym, że pozycja katalogu jest natychmiast usuwana, co oznacza, że ​​od momentu usunięcia pliku żadne nowe procesy nie mogą już otworzyć pliku (ponieważ nie jest do niego dołączona nazwa pliku).

Aby uzyskać szczegółowe informacje, patrz: /programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux

edit3: Ale co jeśli chciałbym zautomatyzować cały proces?

Jak powiedziałem, mogą istnieć pliki, które są zapisywane raz, a następnie odczytywane co jakiś czas (np. Pliki cookie sesji X, pliki PID itp.). Nie zostanie to wykluczone przez ten mały skrypt usuwający (z tego powodu możesz chcieć wykonać test echonajpierw przed usunięciem plików).

Jednym ze sposobów wdrożenia bezpiecznego rozwiązania jest użycie atime.
atimezapisuje czas ostatniego dostępu do każdego pliku. Ale ta opcja systemu plików często jest wyłączona, ponieważ ma dość duży wpływ na wydajność (według tego bloga gdzieś w regionie 20-30%). Jest relatime, ale ten zapisuje tylko czas dostępu, jeśli mtimesię zmienił, więc ten nam nie pomoże.

Jeśli chcesz użyć atime, polecam mieć /tmposobną partycję (najlepiej ramdysk), aby wpływ na wydajność całego systemu nie był zbyt duży.

Po atimewłączeniu wystarczy zastąpić -mtimeparametr w powyższym wierszu polecenia -atime.
Możesz być w stanie je usunąć -not -exec fuser -s {} ';', ale trzymam je tam na wszelki wypadek (na wypadek, gdyby aplikacje utrzymywały pliki otwarte przez długi czas).

Pamiętaj jednak, aby przetestować polecenie, echozanim skończysz usuwać rzeczy, których system nadal potrzebuje!

mreithub
źródło
ładny. Co z plikami zamkniętymi przez długi proces, gdy nie jest on aktualizowany? Jeśli są to pliki kontekstowe, możesz stracić kontekst procesu (co prawda, nie jest to zbyt mądry proces, ale trzeba wiedzieć o oczekiwanych skutkach ubocznych „bocznego” /tmp/oczyszczania).
nik
Na tym polega problem tego podejścia (jak wskazałem w ostatnim akapicie). Najlepszym rozwiązaniem byłoby dodanie kontroli identyfikatora pliku / identyfikatora pliku lub identyfikatora pliku (odpowiednio zmodyfikował odpowiedź)
mreithub
Czy należy to umieścić w skrypcie cron ...?
CMCDragonkai
@CMCDragonkai Oczywiście możesz to umieścić w crontab. Ale jak wspomniałem, mogą istnieć pliki, które są otwierane, ale nie są zapisywane, a zatem mogą nie zostać odfiltrowane przez ten mały skrypt. Dlatego bezpieczniej jest najpierw wydrukować listę zagrożonych plików, a następnie sam zdecydować, czy je usunąć, czy nie. Jeśli masz /tmpoddzielną partycję (np. Ramdysk), możesz ją włączyć atimei użyć -atimeparametru find.
mreithub,
Planuję to zrobić na serwerze. Dlatego nie mogę być tam, aby zliczać wszystkie pliki w tmp przez cały czas. Czy będą jakieś problemy? Myślałem też, że powinniśmy używać relatime nie atime?
CMCDragonkai
4

Nie rzucaj własnym.

Debian / Ubuntu ma tmpreaper, prawdopodobnie jest również dostępny w innych dystrybucjach.

# tmpreaper - cleans up files in directories based on their age

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 
Gringo Suave
źródło
Czy w /etc/tmpreaper.confpliku, jeśli ustawię oba /tmpi /var/tmpjako katalogi czyszczenia, czy mogę długo zalecić usunięcie TMPREAPER_TIMEparametru lub maksimum plików tmp? Słyszałem, że lepiej zachować wiek dla /var/tmpplików niż dla /tmpplików. Ale jeśli można je skonfigurować tylko z tym samym maksymalnym wiekiem, nie mam pojęcia.
Xiaodong Qi,
2

Jeśli chodzi o ostatnią część pytania:

Chociaż nie sądzę, aby istniał tryb otwierania / tworzenia „usuń to, jeśli umrę”, proces może bezpiecznie usunąć plik bezpośrednio po jego utworzeniu, pod warunkiem, że uchwyt tego pliku jest otwarty. Jądro będzie wtedy przechowywać plik na dysku i jak tylko zakończy się ostatni proces, który otworzył plik (czy to przez awarię, czy normalnie), przestrzeń zajmowana przez plik zostanie zwolniona.

W celu ogólnego obejścia problemu polegającego na tym, że niektóre procesy czasami nie czyszczą / tmp, sugerowałbym przyjrzenie się przestrzeniom nazw montowania opisanym na przykład tutaj lub tutaj . Jeśli omawiany proces jest demonem systemowym, systemd i jego natywna funkcja umożliwiająca prywatne systemy plików / tmp mogą być interesujące.

Klaudiusz
źródło
0

Uzyskaj listę plików starszych niż tak, wyklucz pliki, które są otwierane przez cokolwiek z tej listy:

find /tmp -mtime +7 |\
    egrep -v "`lsof -n +D /tmp | awk 'NR>1 {print $9}'| tr \\n \|`" 

lsof -n +D /tmp: szukaj otwartych plików w / tmp
awk 'NR>1 {print $9}': drukuj tylko dziewiątą kolumnę wyjścia lsof, z wyłączeniem nagłówków
tr \\n \|: zamień nowy wiersz na pasek (LUB w egrep)
egrep -v "foo|moo|bar": drukuj linie NIE zawierające foo, moo lub paska

Ярослав Рахматуллин
źródło
0

Zgadzam się z powyższym, aby dodać do tego jednak - zawsze uruchamiam lsof +L1 | grep tmpi albo zabijam, albo restartuję procesy trzymające się „usuniętych” plików tmp: PRZYKŁAD-

# lsof +L1 | grep tmp
xfce4-ter  1699  user   32u   REG    8,6      192     0 818552 /tmp/vte966VLX (deleted)
chrome     3301  user  138u   REG    8,6    16400     0 818547 /tmp/etilqs_Z0guKD7p6ork9iG (deleted)
SeaPhor
źródło
2
SU losowo rozmieszcza posty - więc nie ma ich powyżej ani poniżej. Do którego posta się odnosisz?
Journeyman Geek
0

Możesz po prostu zrobić rm -rf /tmp/*i mieć nadzieję, że nic się nie złamie ...

Solomon Ucko
źródło
1
Sugeruje coś zrobić „i nadzieja przerwy nic” tak naprawdę nie odpowiedzieć OP „to istnieje bezpieczny sposób to zrobić Może Pan rozwinąć, dlaczego twoja sugestia jest bezpieczny.?
bertieb
@bertieb Dobra uwaga. Myślę, że to prawdopodobnie bezpieczne, jeśli nie jest uruchamiane jako root, ale ...
Solomon Ucko