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?
źródło
Odpowiedzi:
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-not
przed 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.-name 'foo*.bar'
lub-uid 123
ograniczyć 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
echo
najpierw przed usunięciem plików).Jednym ze sposobów wdrożenia bezpiecznego rozwiązania jest użycie
atime
.atime
zapisuje 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%). Jestrelatime
, ale ten zapisuje tylko czas dostępu, jeślimtime
się zmienił, więc ten nam nie pomoże.Jeśli chcesz użyć
atime
, polecam mieć/tmp
osobną partycję (najlepiej ramdysk), aby wpływ na wydajność całego systemu nie był zbyt duży.Po
atime
włączeniu wystarczy zastąpić-mtime
parametr 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,
echo
zanim skończysz usuwać rzeczy, których system nadal potrzebuje!źródło
/tmp/
oczyszczania)./tmp
oddzielną partycję (np. Ramdysk), możesz ją włączyćatime
i użyć-atime
parametrufind
.Nie rzucaj własnym.
Debian / Ubuntu ma tmpreaper, prawdopodobnie jest również dostępny w innych dystrybucjach.
źródło
/etc/tmpreaper.conf
pliku, jeśli ustawię oba/tmp
i/var/tmp
jako katalogi czyszczenia, czy mogę długo zalecić usunięcieTMPREAPER_TIME
parametru lub maksimum plików tmp? Słyszałem, że lepiej zachować wiek dla/var/tmp
plików niż dla/tmp
plików. Ale jeśli można je skonfigurować tylko z tym samym maksymalnym wiekiem, nie mam pojęcia.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.
źródło
dla GUI spróbuj tego; http://bleachbit.sourceforge.net/
czyści i szoruje. tryb podglądu.
źródło
Uzyskaj listę plików starszych niż tak, wyklucz pliki, które są otwierane przez cokolwiek z tej listy:
lsof -n +D /tmp
: szukaj otwartych plików w / tmpawk 'NR>1 {print $9}'
: drukuj tylko dziewiątą kolumnę wyjścia lsof, z wyłączeniem nagłówkówtr \\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
Zgadzam się z powyższym, aby dodać do tego jednak - zawsze uruchamiam
lsof +L1 | grep tmp
i albo zabijam, albo restartuję procesy trzymające się „usuniętych” plików tmp: PRZYKŁAD-źródło
Możesz po prostu zrobić
rm -rf /tmp/*
i mieć nadzieję, że nic się nie złamie ...źródło