Mam program, który musi generować pliki tymczasowe. Jest napisany dla maszyn klastrowych.
Jeśli zapisałem te pliki w systemowym katalogu tymczasowym (np . /tmp
:), niektórzy użytkownicy skarżyli się, że program się nie powiódł, ponieważ nie mieli odpowiedniego dostępu do / tmp. Ale jeśli zapisałem te pliki w katalogu roboczym, ci użytkownicy również narzekali, że nie chcą widzieć tych tajemniczych plików.
Która jest lepszą praktyką? Czy powinienem nalegać, aby oszczędzanie na /tmp
to było właściwym podejściem i bronić każdej awarii jako „działającej zgodnie z przeznaczeniem” (tj. Poprosić administratora o odpowiednie pozwolenie / dostęp)?
data
file-handling
SmallChess
źródło
źródło
/tmp
systemu uniksopodobnego, jest źle skonfigurowany. Administrator powinien zrobić coś takiegochmod 1777 /tmp
./tmp/
, której powinieneś użyć zamiast tego. Zobacz niektóre odpowiedzi;)Odpowiedzi:
Pliki tymczasowe muszą być przechowywane w katalogu tymczasowym systemu operacyjnego z kilku powodów:
System operacyjny bardzo ułatwia tworzenie tych plików, zapewniając jednocześnie, że ich nazwy będą unikalne .
Większość oprogramowania do tworzenia kopii zapasowych wie, jakie są katalogi zawierające pliki tymczasowe i pomija je. Jeśli korzystasz z bieżącego katalogu, może to mieć istotny wpływ na rozmiar przyrostowych kopii zapasowych, jeśli kopie zapasowe są wykonywane często.
Katalog tymczasowy może znajdować się na innym dysku lub w pamięci RAM, co znacznie przyspiesza dostęp do odczytu i zapisu .
Pliki tymczasowe są często usuwane podczas ponownego uruchamiania (jeśli znajdują się na ramdysku, są po prostu tracone). Zmniejsza to ryzyko nieskończonego wzrostu, jeśli aplikacja nie zawsze poprawnie usuwa pliki tymczasowe (na przykład po awarii).
Czyszczenie plików tymczasowych z katalogu roboczego może łatwo popsuć się, jeśli pliki są przechowywane razem z plikami aplikacji i użytkownika. Możesz złagodzić ten problem, tworząc osobny katalog w bieżącym katalogu, ale może to prowadzić do innego problemu:
Długość ścieżki może być zbyt długo na niektórych platformach. Na przykład w systemie Windows limity ścieżek dla niektórych interfejsów API, ram i aplikacji są straszne , co oznacza, że możesz łatwo przekroczyć taki limit, jeśli bieżący katalog jest już głęboko w hierarchii drzewa, a nazwy plików tymczasowych są zbyt długie.
Na serwerach często monitoruje się wzrost katalogu tymczasowego . Jeśli użyjesz innego katalogu, może nie być monitorowany, a monitorowanie całego dysku nie pomoże łatwo stwierdzić, że to pliki tymczasowe zajmują coraz więcej miejsca.
Jeśli chodzi o błędy odmowy dostępu, upewnij się, że system operacyjny utworzył dla ciebie plik tymczasowy. System operacyjny może na przykład wiedzieć, że dla danego użytkownika należy użyć katalogu innego niż
/tmp
lubC:\Windows\temp
powinien; w ten sposób, uzyskując bezpośredni dostęp do tych katalogów, możesz rzeczywiście napotkać błąd odmowy dostępu.Jeśli dostaniesz odmowę dostępu nawet podczas korzystania z wywołania systemu operacyjnego, cóż, oznacza to po prostu, że komputer był źle skonfigurowany; zostało to już wyjaśnione przez Blrfl . Konfiguracja systemu zależy od administratora systemu; nie musisz zmieniać swojej aplikacji.
Tworzenie plików tymczasowych jest proste w wielu językach. Kilka przykładów:
Grzmotnąć:
Pyton:
DO#:
PHP:
Rubin:
Zauważ, że w niektórych przypadkach, takich jak PHP i Ruby, plik jest usuwany po zamknięciu uchwytu. To dodatkowa zaleta korzystania z bibliotek dołączonych do języka / frameworka.
źródło
fopen("/tmp/mytmpfile", "w");
Powinienem wykonać jakieś wywołanie systemowe do obsługi plików tymczasowych?tmpfile(3)
celu wygenerowania plików tymczasowych lub przynajmniej dzwonić wmktemp(3)
celu utworzenia nazw plików.Istnieją w tym standardy, a najlepsze, co możesz zrobić, to dostosować się do nich.
POSIX, po którym następuje prawie każdy system operacyjny inny niż mainframe o dowolnym znaczeniu, na który prawdopodobnie natkniesz się, ma przepisy dotyczące tworzenia plików tymczasowych o niepowtarzalnych nazwach w katalogu przy użyciu wartości domyślnych, które środowisko może ponownie skonfigurować:
stdio.h
Nagłówek C może opcjonalnie zawieraćP_tmpdir
makro określające katalog tymczasowy systemu.TMPDIR
jest kanoniczną zmienną środowiskową do zmiany lokalizacji plików tymczasowych. Przed POSIX, były stosowane inne zmienne, więc staram się iść z pierwszą tego czyTMP
,TEMPDIR
iTEMP
że ma wartość, popływać i korzystania z domyślnego systemu, jeśli żadna z tych istnieje.mkstemp()
itempfile()
wygenerują unikalne pliki tymczasowe.Jeśli twoim użytkownikom odmawia się możliwości tworzenia plików tymczasowych, system jest źle skonfigurowany lub administratorzy nie wyjaśniają, jakie są ich zasady dotyczące takich rzeczy. W takich przypadkach byłbyś bardzo pewny, mówiąc, że twój program jest zgodny z dobrze ustalonym standardem przenośności i że jego zachowanie można zmienić za pomocą zmiennych środowiskowych określonych przez standard.
źródło
P_tmpdir
nie jest częściąstdio.h
zgodnie ze specyfikacją języka C. Może być zdefiniowany przez POSIX lub SVID.pam_tmpdir
- to ustawiaTMPDIR
iTMP
być różna dla każdego użytkownika, dla solidności i prywatności. Przydaje się również możliwość ustawieniaTMPDIR
dla pojedynczego polecenia - jeśli masz zwykły katalog tymczasowy w systemie plików RAM dla szybkości, być może będziesz musiał to zrobić dla poleceń, które generują ogromne pliki tymczasowe (na przykład gigantycznysort
). Nie ignoruj standardów / konwencji, których oczekują Twoi użytkownicy!Katalog plików tymczasowych jest wysoce zależny od systemu operacyjnego / środowiska. Na przykład ze względów bezpieczeństwa katalog serwerów-temp-temp jest oddzielony od katalogu os-temp-katalog.
Pod ms-windows każdy użytkownik ma swój własny temp-katalog.
w tym celu należy użyć metody createTempFile (), jeśli taka funkcja jest dostępna.
źródło
Poprzednie odpowiedzi, choć poprawne, nie są poprawne dla większości klastrów komputerowych na dużą skalę.
Klastry komputerowe nie zawsze przestrzegają standardowych konwencji dla maszyn, zwykle z dobrych powodów, i nie ma sensu dyskutować o tym z administratorami.
Twój bieżący katalog odnosi się do centralnego systemu plików, do którego dostęp jest uzyskiwany przez sieć. Jest to nie tylko wolne, ale także nakłada obciążenia na system dla reszty użytkowników, więc nie powinieneś go używać, chyba że nie piszesz dużo i możesz odzyskać od niego, jeśli zadanie się zawiesi.
Węzły obliczeniowe mają własny dysk twardy, czyli najszybszy dostępny system plików i to, czego powinieneś używać. Dokumentacja klaster powinien powiedzieć, co to jest, typowo
/scratch
,/tmp/[jobid]
lub niektóre niestandardowe zmienne środowisko ($SNIC_TMP
w jednym z tych, których używam).Dlatego zalecam skonfigurowanie go przez użytkownika. Domyślne wartości mogą być pierwszymi, do których masz dostęp do zapisu:
$TMPDIR
tmpfile
/tmp
.
Ale spodziewaj się niskiego wskaźnika sukcesu z tym podejściem i upewnij się, że wyślesz duże ostrzeżenie o tłuszczu.
Edycja: dodam kolejny powód, aby wymusić ustawienie użytkownika. Jeden z moich klastrów jest
$TMPDIR
ustawiony na/scratch
opcję zapisu przez użytkownika na lokalnym dysku twardym. Ale dokumentacja mówi, że wszystko, co piszesz poza,/scratch/[jobid]
może zostać usunięte w dowolnym momencie, nawet w połowie cyklu. Jeśli więc przestrzegasz standardów i$TMPDIR
masz zaufanie , napotkasz przypadkowe awarie, bardzo trudne do debugowania. Możesz więc zaakceptować$TMPDIR
, ale nie ufać.Niektóre inne klastry mają poprawnie skonfigurowaną tę zmienną, więc możesz dodać opcję jawnego zaufania
$TMPDIR
, w przeciwnym razie wyślesz duże, grube ostrzeżenie.źródło
W przypadku wielu aplikacji należy rozważyć umieszczenie plików tymczasowych w
$XDG_RUNTIME_DIR
lub$XDG_CACHE_HOME
(inne katalogi XDG dotyczą plików innych niż współczesne). Instrukcje dotyczące ich obliczania, jeśli nie są jawnie przekazywane w środowisku, zobacz specyfikację opartą na XDG lub znajdź bibliotekę, która już implementuje tę część.Należy jednak pamiętać, że
$XDG_RUNTIME_DIR
jest to nowy dodatek i nie ma standardowego powrotu do starszych systemów ze względów bezpieczeństwa.Jeśli żadne z nich nie jest odpowiednie, to
/tmp
jest właściwe miejsce. Nigdy nie należy zakładać, że bieżący katalog jest zapisywalny.źródło
To jest bardziej jak alternatywa, ale możesz odłączyć () plik natychmiast po fopen (). Zależy to od wzorca użytkowania.
Odłączenie plików, jeśli można to zrobić, pomaga na kilka sposobów:
Pliki należy utworzyć w / tmp. Jeśli użytkownik nie ma uprawnień do utworzenia pliku, oznacza to, że system jest źle skonfigurowany.
Pliki nie mogą być tworzone w katalogu domowym użytkowników. Wielu użytkowników, takich jak „nikt”, „dane www” i wielu innych, nie ma prawa pisać w swoich katalogach domowych, a nawet są chroot () - red. Zauważ, że nawet w środowisku chroot / tmp nadal istnieje.
źródło