Jak długo trwają pliki tymczasowe utworzone za pomocą mktemp?

20

Zastanawiałem się, jak długo trwają pliki tymczasowe utworzone za pomocą mktemp. Wydaje mi się dziwne poleganie na pliku, który może zniknąć w dowolnym momencie. Jestem na Ubuntu, jeśli to ma znaczenie.

MOJA V
źródło

Odpowiedzi:

17

Co? Od man mktemp:

DESCRIPTION
   Create  a  temporary  file  or directory, safely, and
   print its name.  TEMPLATE must  contain  at  least  3
   consecutive  `X's  in last component.  If TEMPLATE is
   not specified, use tmp.XXXXXXXXXX,  and  --tmpdir  is
   implied.   Files  are  created  u+rw, and directories
   u+rwx, minus umask restrictions.

mktemppo prostu dodaje losowy ciąg, aby utworzyć unikalną nazwę pliku. Nikt nie usunie go automatycznie.


Ponieważ wydaje się, że jest trochę kłótni, przejdźmy do bardziej szczegółowych szczegółów. mktempStrona podręcznika użytkownika to stwierdza

jeśli SZABLON nie jest określony, --tmpdirzakłada się, jeśli --tmpdirnie jest określony, /tmpzakłada się.

Oznacza to, że samo uruchomienie mktempspowoduje utworzenie pliku o nazwie tmp.RANDOM_STRING w katalogu / tmp . Tak, uruchomienie mktempbez parametrów spowoduje utworzenie pliku, który zostanie wyczyszczony wraz ze wszystkim innym w /tmpsposób zależny od systemu. W przypadku takich plików $TMPTIMEzmienna będzie ważna, jak wyjaśniono w odpowiedzi Chrisa poniżej. W przypadku wielu dystrybucji ustawieniem domyślnym jest czyszczenie /tmpkażdego rozruchu, ponieważ $TMPTIMEjest ustawiony na 0. W większości (jeśli nie we wszystkich) dystrybucjach jest to ustawione w pliku /etc/default/rcS:

$ grep TMPTIME /etc/default/rcS
TMPTIME=0

Teraz, jeśli zrobić określić szablon, na przykład mktemp fooXXXwtedy plik o nazwie fooXXXjest tworzony w bieżącym katalogu, w którym XXXjest zastąpiony przez trzech losowych znaków. Ten plik nigdy nie zostanie usunięty, chyba że zdecydujesz się to zrobić. Tylko pliki w „oficjalnych” katalogach tymczasowych, takie jak /tmpte, które są zawsze automatycznie usuwane przez system, nie można ustawić magicznego bitu, który określa plik tymczasowy, pliki na zewnątrz /tmpi podobne nie są automatycznie usuwane.

Aby odpowiedzieć na twoje główne pytanie, oczywiście dziwne jest poleganie na pliku, który może zniknąć, dlatego ludzie nie polegają na plikach tmp, są one tworzone do tymczasowego przechowywania danych, a następnie możemy o nich zapomnieć. Istnieje wiele sposobów tworzenia trwałych plików o losowej nazwie. Na przykład:

echo "foo" > $RANDOM.txt
echo "foo" > `mktemp fooXXX.txt`
echo "foo" > $$.txt
terdon
źródło
2
To nie odpowiada na moje pytanie. Mówi, że tworzy plik „tymczasowy” i nie podaje informacji o tym, jak długo to trwa. Czy to trwa wiecznie? Czy katalog tmp zostaje zablokowany podczas uruchamiania systemu?
MYV
@Maksim zobacz zaktualizowaną odpowiedź. Twoje pytanie nie dotyczyło również tmpwyczyszczenia katalogu, ale usunięcia plików utworzonych za pomocą mktemp. Jak widać, te dwa niekoniecznie są powiązane :).
terdon
6

Pamiętaj, że pliki tymczasowe mogą zostać usunięte podczas uruchamiania systemu lub zgodnie z TMPTIME. Zobacz, co masz /etc/cron.daily/tmpwatch.

/var/tmp/z drugiej strony jest zwykle odporny na tmpwatch.

Pliki tymczasowe są tworzone (zwykle) przez krótki czas. Mają tymczasową nazwę, więc nie jest łatwo wykonać atak czasowy i zwykle są usuwane, gdy nie są już potrzebne programowi. Zwykle skrypt przechowuje ten plik przez bardzo krótki czas, zwykle przetwarzając jakiś tekst lub inne pliki i usuwa go, gdy tylko nie jest potrzebny. Jeśli twój skrypt się zawiesi, będziesz miał również procedury porządkowania folderów / tmp (jeśli właśnie tam zdecydowałeś się je umieścić).

Nie musisz tworzyć pliku tymczasowego /tmp

Chris
źródło
Widząc, że mktempmożna uruchomić w dowolnym katalogu i po prostu generuje dowolną nazwę pliku, nie rozumiem, jak to ma cokolwiek wspólnego tmpwatch.
terdon
1
Domyślnie mktemptworzy pliki w /tmp/.
Chris
tylko jeśli nie podasz SZABLONU, zobacz moją zaktualizowaną odpowiedź.
terdon
1

Pliki tymczasowe nie znikają same z siebie. Są to tak zwane pliki tymczasowe, ponieważ w skrypcie lub sesji lub gdziekolwiek je tworzysz, oczekuje się, że usuniesz je po zakończeniu. Lub zostaw ich leżących, jeśli to twoja sprawa. mktemp istnieje wyłącznie po to, aby pozwolić ci wymyślić plik o nazwie coś unikalnego, aby nie zastępował istniejącego pliku.

EBGreen
źródło
Czy niektóre systemy nie używają TMPTIME?
skromny
@demure tak, ale tylko do czyszczenia /tmplub innych katalogów tmp. Nie tylko losowo usunie pliki utworzone przez użytkownika.
terdon
Domyślnie mktemptworzy pliki w /tmp/.
Chris