Jak zapobiec czyszczeniu folderu w katalogu / tmp?

12

To pytanie dotyczy Ubuntu 14.10 na moim laptopie programisty.

Mam folder, w /tmpktórym aplikacja służy do umieszczania tymczasowych plików. Ta aplikacja zazwyczaj tworzy folder tymczasowy w moim katalogu głównym, a następnie usuwa go. Z jakiegoś powodu to nie działa, gdy homedir jest zaszyfrowany. Zamiast tego zrobiłem dowiązanie symboliczne do /tmp/foomojego homediru. Moja aplikacja może tam pisać i tworzyć tymczasowy podfolder.

Teraz /tmp/foojest usuwany przy każdym ponownym uruchomieniu komputera. Do tej pory po ponownym uruchomieniu utworzyłem folder ręcznie. Teraz nauczyłem się w Jak sprzątany jest katalog / tmp? że jest praca, która to robi.

Sprawdziliśmy /etc/init/mounted-tmp.confale mój bashfu a zwłaszcza mój findfu nie są wystarczające, aby robić to, co chcę. Oto fragment tego pliku:

   EXCEPT='! -name .
            ! ( -path ./lost+found -uid 0 )
            ! ( -path ./quota.user -uid 0 )
            ! ( -path ./aquota.user -uid 0 )
            ! ( -path ./quota.group -uid 0 )
            ! ( -path ./aquota.group -uid 0 )
            ! ( -path ./.journal -uid 0 )
            ! ( -path ./.clean -uid 0 )
            ! ( -path "./...security*" -uid 0 )'

   # Remove all old files, then all empty directories
   find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete
   find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete

Chcę dodać warunek, który powoduje, że usuwa wszystko w środku /tmp/foo, ale nie /tmp/foosam. Jak mogę to zrobić?

simbabque
źródło
Czy /tmp/fookatalog lub plik?
terdon
Katalog. W środku są pliki.
simbabque
Dlaczego nie dodać mkdir /tmp/foowcześniej end script?
Hagen von Eitzen,
Po prostu FYI (może już to wiesz): 14.10 osiąga EOL w lipcu 2015 r., Więc naprawdę powinieneś jak najszybciej uaktualnić do Vivid.
Léo Lam,

Odpowiedzi:

20

/etc/init/mounted-tmp.confjest częścią mountallpakietu, więc wszelkie aktualizacje tego pakietu i sugerowane zmiany zostaną cofnięte.

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

Zamiast tego, zgodnie ze standardem systemu plików Hierachy (FHS) ;

W odniesieniu do / tmp :

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

W odniesieniu do / var / tmp :

Katalog / var / tmp jest udostępniany programom wymagającym plików tymczasowych lub katalogów, które są zachowywane między restartami systemu. Dlatego dane przechowywane w / var / tmp są bardziej trwałe niż dane w / tmp.

Więc powinieneś zmienić swój symboliczny link, aby użyć /var/tmpzamiast /tmp.

mgor
źródło
3
Klasyczny przykład, kiedy masz młotek, wszystko wygląda jak gwóźdź.
WernerCD
@WernerCD, czy mógłbyś wyjaśnić, co przez to rozumiesz? Mówisz, że /var/tmpto nie jest dobry pomysł?
simbabque
6
Kiedy wszystko, co masz, to młotek ... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.Mówię, że OP używa / tmp do czegoś, do czego nie jest przeznaczony - Używanie / tmp jako młota do jego problemu z utrzymaniem tmp-ale-niezupełnie -tmp rzeczy. / var / tmp ma być utrzymywane między ponownymi uruchomieniami, więc jest to poprawna odpowiedź.
WernerCD
8

Nie jest to ściśle odpowiedź na twoje pytanie, ale może się okazać, /var/tmpże jest to bardziej odpowiednia lokalizacja, ponieważ nie zostanie wyczyszczona po ponownym uruchomieniu. Jest przeznaczony do plików tymczasowych, których nie należy automatycznie odrzucać po krótkim czasie.

Często jednak robię sobie folder w / opt do przechowywania losowych rzeczy, których nie chcę w domu. To odpowiednie miejsce do umieszczenia rzeczy, które są poza kontrolą głównego systemu operacyjnego.

Andrew Aylett
źródło
To jest właściwy pomysł. Jeśli / tmp nie robi tego, co chcesz, przechowuj informacje w innym miejscu - nawet na innym dysku, jeśli jest dostępne miejsce. Nie zadzieraj z rzeczami, których Linux (i inni programiści) oczekują w określony sposób, chyba że jest to jedyny sposób na uzyskanie pożądanego rezultatu.
Joe
6

Tak jak:

EXCEPT='! -name .
            ...
            ! ( -path "./foo" )'

   # Remove all old files, then all empty directories
   ...
   find /tmp/foo/* -depth -xdev $TEXPR -delete

Przykład:

$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$

Zgadzam się z użytkownikiem aap: Powinieneś się tym zająć w oprogramowaniu używanym przez ponowne utworzenie katalogu tam, jeśli są to pliki tmp, lub użyć innego katalogu, jeśli nie są to pliki tmp, które nie są czyszczone.

Rinzwind
źródło
To nie działa. Chociaż findpolecenie działa ręcznie zgodnie z oczekiwaniami, katalog jest nadal usuwany po edycji /etc/init/mounted-tmp.conf. Wygląda na to, że dzieje się tu coś jeszcze.
terdon
wth ehm. to powinno oznaczać, że pierwsza linia jest wadliwa. może musi być względny (?)
Rinzwind
@terdon tak wydaje się, że musi być względny w stosunku do / tmp /
Rinzwind
Nie sądzę, próbowałem różnych permutacji, w tym -path ./fooi nawet -name '*foo*'i żadna z nich nie działała (na Ubuntu Server 14.04). Myślę, że to po prostu niewłaściwy plik i szukamy w niewłaściwym miejscu. To, co sugerujesz, powinno działać, po prostu nie wydaje się.
terdon
0

Nie jest dobrym pomysłem mieć pliki o przyszłej wartości, zapisywać w katalogu / tmp (/ var / tmp, jak sugerują inni, jest lepszym miejscem). To powiedziawszy, możesz spróbować na chattr. Powinno to zostać uruchomione po zamknięciu aplikacji, ale przed zamknięciem. Pamiętaj, że ta operacja nie pozwoli, aby cokolwiek zapisało się w tym katalogu odtąd.

dotknij /tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me

Hopping Bunny
źródło
W jaki sposób byłoby to przydatne, jeśli chcę mieć katalog tymczasowy?
simbabque,
-1

Uruchomić to:

echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel 

następnie Dodaj to do / etc / inittab patrz tutaj: gdzie jest plik inittab? :

foo:2345:boot:/bin/foodel

Spowoduje to utworzenie / etc / foo podczas rozruchu, jeśli nie istnieje, a następnie opróżnienie.

To samo zrobi przy logowaniu do bash:

echo "/bin/foodel" >> ~/.bashrc
Daniel
źródło
Ubuntu wersja 14 nie używa /etc/inittab. Jest to wyraźnie i jednoznacznie podane na stronie podręcznika.
JdeBP,
* facepalm * Przepraszam @JdeBP, tak się dzieje po żonglowaniu 4 różnymi wersjami systemu Linux. Może umieścić gdzieś kod podany askubuntu.com/questions/34308/where-is-inittab-file
Daniel