/ tmp è garantito per esistere?


42

Devo controllare e creare /tmpprima di scrivere in un file al suo interno? Supponiamo che nessuno abbia corso sudo rm -rf /tmpperché è un caso molto raro


16
Cosa intendi con "garantito"? L'FHS lo richiede, quindi qualsiasi distribuzione conforme a FHS lo avrebbe. Tuttavia, ci sono molte distro per scopi speciali che non sono conformi a FHS. È certamente possibile creare una distro Unix / Linux senza / tmp, ma la necessità di occuparsene dipende interamente dal fatto che ti interessi supportare tali sistemi.
Lie Ryan,

1
Perché non creare il tuo dir temporaneo ed eliminarlo quando hai finito con esso invece di fare affidamento sul prossimo riavvio per ripulire?
WGroleau

4
@WGroleau Non conosco OP, ma sugli script che scrivo per il mio sistema, di solito inserisco i file temporanei in una sottodirectory di /tmp(creata con mktemp), quindi rimuovo quella sottodirectory all'uscita. La maggior parte del mio sistema è montato in sola lettura e questo mi impedisce di dover ricordare cdin una directory scrivibile
Fox,

1
@WGroleau Non mi affido ai riavvii per ripulirlo. le mktempsembra davvero grande, I'l probabilmente finiscono utilizzando tale.
Ayush,

7
@jamesqf Sì, il riavvio non è necessario per cancellare /tmp. Tuttavia, al contrario, è permesso farlo, e presumibilmente WGroleau ha estrapolato troppo da quello. My /tmpè tmpfsin attesa nella RAM, quindi viene cancellato allo spegnimento. Tuttavia, questo è solo un dettaglio del sistema, che non è garantito dall'FHS. Quindi, per il commento originale, è folle affidarsi alla presenza o all'assenza di qualcosa /tmptra gli stivali.
underscore_d

Risposte:


60

I mandati FHS che /tmpesistono, così come POSIX, in modo da poter fare affidamento sul fatto di essere lì (almeno su sistemi conformi; ma in realtà è praticamente garantito che siano presenti su sistemi simili a Unix). Ma non dovresti: l'amministratore di sistema o l'utente potrebbero preferire altre posizioni per i file temporanei. Vedi Trovare la directory tmp corretta su più piattaforme per maggiori dettagli.


Questo è ovviamente un errore di progettazione. /tmpè un nome. $TMPDIRè un altro nome. Se non puoi contare /tmpsull'essere il nome giusto della directory temporanea, perché puoi contare $TMPDIRsull'essere il nome della variabile d'ambiente giusta? Perché non dovrei controllare $TMPDIRVARper ottenere il nome di quella variabile? Un livello di riferimento indiretto è sufficiente ed /tmpè esattamente quello. Non dice nulla sulla memoria effettiva, è solo un nome.
MSalters

@MSalters c'è qualcosa in più. Prima degli spazi dei nomi, $TMPDIRconsentiva a ciascun utente di disporre di una directory temporanea separata o persino di utilizzare directory temporanee diverse per programmi diversi; un singolo /tmpnon lo fornisce (di nuovo, senza spazi dei nomi o qualcosa di simile). C'è anche molta storia (o eredità) da tenere in considerazione.
Stephen Kitt,

Per utente è un punto valido, ma è per questo che un buon design dovrebbe usarlo ~/tmp. Che può essere comunque la stessa posizione fisica /tmp, ovviamente.
MSalters

44

In pratica, /tmpè praticamente garantito che esista. Tuttavia, anche se esiste, ciò non significa che dovresti inserire lì file temporanei.

La convenzione standard prevede l'uso della TMPDIRvariabile d'ambiente. Se esiste, punta a una directory per i file temporanei. Se non esiste, inserisci i file temporanei /tmp.

In uno script di shell, è possibile utilizzare "${TMPDIR:-/tmp}"come posizione del file temporaneo: questo si espande al valore di TMPDIRse è impostato¹ e in caso /tmpcontrario. Oppure puoi impostare TMPDIRin modo condizionale nel caso in cui non sia impostato, con il comando

: "${TMPDIR:=/tmp}"

e quindi creare file temporanei all'interno "$TMPDIR".

Si noti che qualsiasi applicazione può creare file in /tmpo $TMPDIR. Inoltre, questa directory può essere condivisa tra gli utenti, quindi è necessario prestare attenzione alle autorizzazioni durante la creazione di un file. Molti sistemi (Linux, * BSD) hanno un comando mktempche crea file in modo sicuro nella directory giusta. In genere è una buona idea utilizzare mktempper creare file e directory temporanei, specialmente da uno script di shell, in cui è impossibile creare un file in modo sicuro in una directory condivisa a causa della possibilità di attacchi symlink ( mkdirva bene se si gestiscono correttamente gli errori).

¹ e non vuoto: se la variabile è vuota, non è utilizzabile come lo è comunque, ed è generalmente una buona idea trattare le variabili vuote o non impostate allo stesso modo se devono contenere un nome file.


11
Forse potresti menzionare che gli utenti devono aspettarsi collisioni di nomi di file. Quindi IMO l'unico modo raccomandato per creare file in / tmp è il comando mktempe questo dovrebbe anche gestire $ TMPDIR "automaticamente.
Rudyier

Questa è la risposta che vuoi Ho visto sistemi senza / bin e tanto meno / tmp.
Giosuè,

1
Anche A.10 Struttura della directory e dispositivi indica: ... La /tmpdirectory viene mantenuta in POSIX.1-2008 per ospitare applicazioni storiche che ne assumono la disponibilità. Le implementazioni sono incoraggiate a fornire nomi di directory adeguati nella variabile d'ambiente TMPDIRe le applicazioni sono incoraggiate a usare il contenuto di TMPDIRper creare file temporanei. ...
Andrew Henle,

3
Solo triste per scoprire che mktempnon è in POSIX, anche se è già nei sistemi operativi più popolari come GNU (Linux) , OpenBSD , FreeBSD e macOS .
Franklin Yu,

1
Potrebbe valere la pena aggiungere che mktempfunzioni simili sono disponibili in molti linguaggi di scripting e programmazione, come libc , Perl e Python .
Gaurav,

6

Sebbene sia molto probabile che esista, dovresti controllare per un altro motivo: non è garantito che sia grande . Su molti sistemi, /tmpè supportato dalla RAM piuttosto che dal disco e probabilmente sarà limitato a pochi GB. (Sui sistemi Fedora, per impostazione predefinita è metà della RAM.) Quindi, non dovresti controllare solo l'esistenza, ma se c'è spazio per mettere tutto ciò che intendi mettere lì.

Se hai qualcosa di grande, usa /var/tmp/.


2
Non sono sicuro che sia "il modo Unix" per controllare lo spazio disponibile prima di procedere, soprattutto perché non si sa sempre esattamente quanto spazio sarà necessario. In ogni caso, devi essere pronto a gestire con grazia un errore di scrittura nel caso in cui il filesystem si riempia; e se hai intenzione di farlo, cosa si ottiene facendo un controllo anticipato che sarà incline a falsi negativi e positivi?
Nate Eldredge,

2
Dipende da quanto con grazia puoi gestire il caso di fallimento, immagino. Il punto principale è non dare per scontato che sia in /tmpgrado di gestire file di grandi dimensioni. Diciamo che è un download da 10 GB su un collegamento a velocità moderata. "Unix way" o no, è piuttosto miserabile scoprire diverse ore in cui non funzionerà.
mattdm,

1
@mattdm Il controllo anticipato è corretto ma l'errore deve essere gestito. Forse / tmp ha 10 GB disponibili all'avvio del download ma un altro utente copia 5 GB lì mentre il download è in esecuzione. E adesso? Eh.
Zan Lynx,

Decisamente! Non intendo questo come una scusa per non gestire il fallimento.
mattdm,

"Se hai qualcosa di grande" - usa / tmp e lascia scambiare il sistema operativo se è necessario.
UKMonkey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.