Do którego folderu mam pisać jako pliki pośrednie jako programista?

17

Zaczynam pisać kilka skryptów bash dla mojego projektu i potrzebują one plików pośrednich lub zmiennych do napisania.

Chcę wiedzieć, do których folderów mam pewność, że mam dostęp, gdy ktoś uruchomi mój skrypt? Czy to powszechna praktyka /tmp/? A może powinienem użyć czegoś innego?

Programowanie Noob
źródło

Odpowiedzi:

15

Jeśli trzeba napisać niektóre pliki tymczasowe, które tylko ostatni tak długo, jak skrypt lub aplikacja jest uruchomiona, należy skorzystać z katalogu wskazanego przez TMPDIRzmienną środowiskową, lub jeśli ta zmienna nie jest zdefiniowana /tmp.

/tmpjest czyszczony w czasie rozruchu w niektórych systemach (czasami nawet w pamięci RAM, np. domyślnie w Solarisie i w niektórych instalacjach Linuksa), więc nie można go używać do plików, które muszą przetrwać awarię zasilania lub restart. /var/tmpmoże być używany do plików, które muszą przetrwać restart, ale które mogą być czyszczone przez administratora systemu od czasu do czasu. Jeśli aplikacja musi zapisywać pliki na stałe, zapisz je gdzieś w katalogu domowym użytkownika (w ~/.programmingnoobsapplub ~/.cache/programmingnoobsapp) lub pod /var/lib/programmingnoobsapplub /var/cache/programmingnoobsapp.

Pamiętaj, że /tmpjest to wspólne dla wszystkich użytkowników, więc musisz zachować ostrożność podczas tworzenia pliku w tym miejscu. Musisz wybrać nazwę pliku, która jeszcze nie istnieje, i musisz uważać, aby nie dopuścić do wyścigu, w którym inny proces tworzy plik przed tobą z różnymi uprawnieniami, co może stanowić lukę bezpieczeństwa (jeśli inny proces działa jako inny użytkownik, może wtedy uzyskiwać dostęp do danych procesu i modyfikować je). Użyj mktemppolecenia, aby utworzyć plik w /tmplub /var/tmp. Domyślnie mktemptworzy plik w $TMPDIR, lub /tmpjeśli TMPDIRjest rozbrojony, co zwykle jest właściwym miejscem. Jeśli chcesz użyć wielu plików tymczasowych, a nawet jeśli potrzebujesz jednego, zalecamy utworzenie katalogu dla wszystkich plików tymczasowych za pomocąmktemp -d i usuwając go na końcu skryptu.

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…
Gilles „SO- przestań być zły”
źródło
wrt do mktemp, nie usuwam plików tymczasowych na końcu mojego skryptu. Mam zadanie cron tmpwatch, które automatycznie usuwa stare pliki. W zdecydowanej większości przypadków nie czytam pliku pośredniego, a system sam usunie pliki. Jeśli jednak coś pójdzie nie tak ze skryptem, mam wszystkie moje pliki pośrednie do łatwego debugowania.
emory
1
+1 dla mktemp. Dla mnie to poprawna odpowiedź: powierz zadanie bezpiecznego utworzenia pliku tymczasowego mktemp(zobacz ten artykuł ). Chociaż jedna odpowiedź cytująca FHSma również wielką wartość.
Carlos Campderrós
Dlaczego inicjujesz tmp_rootprzed przypisaniem? Czy nie byłoby to dla niego bardziej naturalne unset?
l0b0
@ l0b0 Albo będzie działać (z wyjątkiem poniżej set -u, ale to rzadkie). Przed ustawieniem pułapki należy ją (od) ustawić na bezpieczną wartość, na wypadek gdyby skrypt został zabity tuż po ustawieniu pułapki.
Gilles „SO- przestań być zły”,
Dodałbym set -o errexit, że jeśli tmp_rootjest już ustawiony w środowisku tylko do odczytu, nie zniszczy niewłaściwego katalogu ...
l0b0
2

Tylko w celu uzupełnienia odpowiedzi, które zostały już opublikowane.

Istnieją również /dev/shmniektóre dystrybucje Linuksa, których można użyć do tymczasowego przechowywania. Tego magazynu należy używać tylko wtedy, gdy wydajność I / O pliku jest krytycznym czynnikiem podanym przy /dev/shmkorzystaniu z tmpfssystemu plików. Należy go również używać do plików i danych o rozsądnych rozmiarach. System tmpfsplików wykorzystuje systemową pamięć RAM jako pamięć, więc nie jest trwały od rozruchu do rozruchu.

Jest dobry przegląd wszystkich opcji wymienionych tutaj na StackOverflow, a także w tym pytaniu zatytułowanym: / tmp vs. / dev / shm do tymczasowego przechowywania plików w systemie Linux? . Jest to dobrze omówione w tym pytaniu SuperUser zatytułowanym: Kiedy powinienem używać / dev / shm /, a kiedy powinienem / tmp? .

Bibliografia

slm
źródło
0

Tak, /tmpgłównie dla plików, które są wymagane tymczasowo. / Tmp ma lepki bit, co oznacza, że ​​tylko właściciel elementu, właściciel katalogu lub administrator może zmieniać nazwy lub usuwać pliki. wiele programów używa tego do tworzenia plików blokady i do tymczasowego przechowywania danych. W niektórych dystrybucjach katalog ten jest czyszczony podczas uruchamiania lub zamykania.

Raza
źródło
1
Nie wszystkie katalogi / tmp są czyszczone podczas rozruchu. Na przykład domyślne instalacje w systemie AIX nie (a jest to UNIX i Linux, nie tylko Linux).
EightBitTony
Jeśli jednak jest rezydentem „pamięci”, co wydaje się być domyślne w wielu przypadkach, znika, gdy system zatrzymuje się z jakiegokolwiek powodu.
mdpc,