Zapobiegaj usuwaniu katalogu w / tmp

10

Często używam /tmpkatalogu na moim komputerze z systemem Linux do przechowywania plików tymczasowych (np. Plików PDF ze strony, która chce, żebym go najpierw pobrał itp.) I często tworzę katalog z moją nazwą użytkownika. Ale przy każdym uruchomieniu jest usuwany (w tym wszystkie pliki). Teraz wiem, że mogę go umieścić /var/tmp, ale chcę, aby cała jego zawartość została usunięta, ale sam katalog powinien zostać zachowany. Więc:

tmp
 |- me # this should stay
 |  |- foo1 # this should be deleted...
 |  |- bar1 # ...and this as well
 |- other stuff...

Czy jest na to sposób? Może z uprawnieniami lub ze specjalną konfiguracją?

Linux4win
źródło
1
Aby obejść ten problem, możesz umieścić kod w plikach logowania powłoki, aby w razie potrzeby „test & mkdir”.
Jeff Schaller
3
/tmpjest prawdopodobnie systemem tmpfsplików. Te pliki nie są tak naprawdę usuwane; są po prostu przechowywane w pamięci RAM i tracone podczas ponownego uruchamiania. Dlatego otrzymujesz odpowiedzi, które sprowadzają się do „odtworzenia go przy rozruchu lub logowaniu”
MSalters

Odpowiedzi:

4

Jednym rozwiązaniem byłoby użycie @rebootzadania cron:

@reboot mkdir -p "/tmp/$USER"

Dodanie tego do pliku crontab crontab -espowoduje, że będzie on uruchamiany przy każdym uruchomieniu komputera.

Albo użyj

mkdir -p "/tmp/$USER"

w pliku startowym powłoki.

W obu przypadkach możesz także użyć

TMPDIR=/tmp/$USER
export TMPDIR

w pliku startowym powłoki, jeśli chcesz użyć tego katalogu jako domyślnego katalogu tymczasowego.

Kusalananda
źródło
Czy to a) utworzy katalogi dla wszystkich użytkowników i b) uruchomi się również po „zimnym” uruchomieniu?
Linux4win,
1
@ Linux4win Ta odpowiedź odpowiada na potrzeby pojedynczego użytkownika, ponieważ tak sformułowano pytanie. Nie ma znaczenia, w jaki sposób komputer jest uruchamiany (gorący, zimny lub letni), ale nie uruchomi się po wznowieniu ze stanu hibernacji (ponieważ to nie uruchamia się).
Kusalananda
Z jakiegoś powodu dodawanie @reboot mkdir -p "/tmp/$USER"na końcu crontab nic nie robi, a podczas pracy mkdir -p "/tmp/$USER"faktycznie tworzy katalog. Drugi nie działa dla mnie w drodze, bo trzeba uzyskać dostęp do mojego /tmppośrednictwem innych programów i rozpalanie za każdym powłoki jest trochę irytujące ...
Linux4win
@ Linux4win Zadanie @rebootcron nie tworzy katalogu? Czy otrzymujesz wiadomość e-mail na konto z komunikatami o błędach od demona cron?
Kusalananda
no nie ... Może dlatego, że nie skonfigurowałem mail? Czy to nie jest wymagane?
Linux4win,
14

Używam pam-tmpdirdo tego: tworzy przy logowaniu tymczasowy prywatny katalog użytkownika. Aby to skonfigurować, dodaj

session optional pam_tmpdir.so

do odpowiednich usług PAM; w systemie opartym na Debianie, instalacja libpam-tmpdirpakietu zaoferuje to za Ciebie, lub możesz dodać linię do /etc/pam.d/common-session. Przy następnym logowaniu znajdziesz katalog /tmp/userz identyfikatorem użytkownika TMPi TMPDIRodpowiednio skonfigurowany.

Stephen Kitt
źródło
7
Czy możesz wyjaśnić, jakie są odpowiednie usługi PAM i jak można do nich dodać linię? Jakie pliki należy edytować?
terdon
2

Jeśli nie masz systemu z systememd i używa on systemd-tmpfiles do zarządzania czyszczeniem, powinieneś skonfigurować katalog przy użyciu tego systemu.

Oto pełna dokumentacja . Prawdopodobnie możesz osiągnąć to, co chcesz, tworząc /etc/tmpfiles.d/something.conftakie treści, jak:

d     /tmp/your_username   0750 your_user your_group  - -
viraptor
źródło
1

Jak wskazano w komentarzach, /tmpdotyczy plików, które są przejściowe i nie zostaną pominięte, jeśli zostaną usunięte. Jeśli coś jest w środku, a komputer uruchomi się ponownie, wszystko, co tam napisałeś, zniknie i będziesz musiał zacząć od nowa, co oznacza, że ​​te pliki mogły wcale nie być tak tymczasowe.

Przez wiele lat utrzymywałem katalog tymczasowy w moim katalogu domowym, poczynając od gigabajta, który zajmował dużo miejsca, i stwierdził, że wymaga okresowego czyszczenia, aby pozbyć się starych i kruchych plików. Przez większość czasu, które mi pozostały po tym procesie, miałem mniej niż kilka tygodni, więc teraz oczyszczam je za pomocą zadania cron, które działa raz dziennie:

find $HOME/tmp -depth -mtime +30 -print0 | xargs -0 -r rm -rf

Wszystko, co pobieram lub tworzę w trybie tymczasowym, trafia tam, a system czyści wszystko, co pozostawiam. Wszystko, co potrzebuje stałego domu, dostaje się na długo przed tym, zanim cron się go pozbędzie.

Blrfl
źródło
mkdir a a/b; touch a/b/c. Teraz poczekaj, aż upłynie 30 dni. Po usunięciu nastąpi caktualizacja b, co oznacza, że ​​musi poczekać kolejne 30 dni. Podobnie z chwilą ausunięcia b. Po drugie, jeśli utworzysz pliki, bale nie dotkniesz ich aprzez 30 dni, akatalog zostanie trafiony rm -rfi wyczyści twoje ostatnie pliki b.
roaima,
find "$HOME"/tmp -mtime +30 -type f -delete; find "$HOME/tmp" -depth -mmin +60 -type d -exec rmdir {} + 2>/dev/nullpracuje dla mnie
roaima,