ist / tmp garantiert vorhanden?


42

Muss ich prüfen und erstellen, /tmpbevor ich in eine Datei darin schreibe? Angenommen, niemand ist weggelaufen, sudo rm -rf /tmpda dies ein sehr seltener Fall ist


16
Was meinst du mit "garantiert"? Das FHS verlangt es, also würde es jede FHS-konforme Distribution haben. Es gibt jedoch viele Sonderverteiler, die nicht FHS-konform sind. Es ist sicherlich möglich, eine Unix / Linux-Distribution ohne / tmp zu erstellen, aber ob Sie sich darum kümmern müssen, hängt ganz davon ab, ob Sie sich für die Unterstützung dieser Systeme interessieren.
Lie Ryan

1
Warum erstellen Sie nicht Ihr eigenes temporäres Verzeichnis und löschen es, wenn Sie damit fertig sind, anstatt sich auf den nächsten Neustart zu verlassen, um aufzuräumen?
WGroleau

4
@WGroleau Ich kenne mich mit OP nicht aus, aber bei Skripten, die ich für mein eigenes System schreibe, lege ich normalerweise temporäre Dateien in ein Unterverzeichnis von /tmp(erstellt mit mktemp) und entferne dieses Unterverzeichnis beim Beenden. Das meiste meines Systems ist schreibgeschützt und dies verhindert, dass ich mich cdan ein beschreibbares Verzeichnis erinnern muss
Fox

1
@WGroleau Ich verlasse mich nicht auf Neustarts, um es zu bereinigen. Das mktempsieht wirklich toll aus, ich werde das wahrscheinlich nicht mehr benutzen.
Ayush

7
@jamesqf Ja, zum Löschen ist kein Neustart erforderlich/tmp . Umgekehrt ist dies jedoch zulässig , und vermutlich hat WGroleau zu weit davon extrapoliert. Mein Arbeitsspeicher /tmpist tmpfsim Arbeitsspeicher enthalten, wird also beim Herunterfahren gelöscht. Dies ist jedoch nur ein Detail des Systems, das von der FHS nicht garantiert wird. Nach dem ursprünglichen Kommentar ist es töricht, sich auf die Anwesenheit oder Abwesenheit von irgendetwas /tmpzwischen den Stiefeln zu verlassen.
Underscore_d

Antworten:


60

Die existierenden FHS- Mandate /tmpund POSIX, sodass Sie sich darauf verlassen können, dass es da ist (zumindest auf kompatiblen Systemen; in Wirklichkeit ist es jedoch so gut wie garantiert, dass es auf Unix-ähnlichen Systemen vorhanden ist). Sie sollten dies jedoch nicht tun: Der Systemadministrator oder der Benutzer bevorzugen möglicherweise andere Speicherorte für temporäre Dateien. Weitere Informationen finden Sie unter Ermitteln des richtigen tmp-Verzeichnisses auf mehreren Plattformen .


Dies ist natürlich ein Designfehler. /tmpist ein Name. $TMPDIRist ein anderer Name. Wenn Sie nicht /tmpmit dem richtigen Namen des temporären Verzeichnisses rechnen können, warum können Sie dann $TMPDIRmit dem Namen der richtigen Umgebungsvariablen rechnen ? Warum sollte ich nicht $TMPDIRVARnach dem Namen dieser Variablen suchen? Eine Indirektionsebene ist ausreichend und /tmpgenau das. Es sagt nichts über den tatsächlichen Speicher aus, es ist nur ein Name.
MSalters

@MSalters Da steckt noch ein bisschen mehr dahinter. Vor Namespaces $TMPDIRdarf jeder Benutzer ein separates temporäres Verzeichnis haben oder sogar verschiedene temporäre Verzeichnisse für verschiedene Programme verwenden. eine Single /tmpbietet das nicht (wieder ohne Namespaces oder ähnliches). Es gibt auch viel Geschichte (oder Vermächtnis) zu berücksichtigen.
Stephen Kitt

Pro Benutzer ist ein Punkt gültig, aber das ist, warum ein gutes Design dafür verwenden würde ~/tmp. Das kann /tmpnatürlich immer noch derselbe physische Ort sein wie .
MSalters

44

In der Praxis /tmpist so ziemlich garantiert zu existieren. Selbst wenn es existiert, bedeutet dies nicht, dass Sie temporäre Dateien dort ablegen sollten.

Die Standard - Konvention ist es, die verwenden TMPDIRUmgebungsvariable. Wenn es existiert, zeigt es auf ein Verzeichnis für temporäre Dateien. Wenn es nicht vorhanden ist, legen Sie temporäre Dateien in /tmp.

In einem Shell-Skript können Sie es "${TMPDIR:-/tmp}"als Speicherort für temporäre Dateien verwenden: Dies wird auf den Wert von TMPDIRif it's set¹ und /tmpandernfalls auf expandiert . Oder Sie können TMPDIRmit dem Befehl eine Bedingung festlegen , falls sie nicht festgelegt ist

: "${TMPDIR:=/tmp}"

und erstellen Sie dann temporäre Dateien im Inneren "$TMPDIR".

Beachten Sie, dass jede Anwendung Dateien unter /tmpoder erstellen kann $TMPDIR. Außerdem kann dieses Verzeichnis von Benutzern gemeinsam genutzt werden, sodass Sie beim Erstellen einer Datei auf Berechtigungen achten müssen. Viele Systeme (Linux, * BSD) haben einen Befehl, mktempder Dateien sicher im richtigen Verzeichnis erstellt. Es ist im Allgemeinen eine gute Idee mktemp, temporäre Dateien und Verzeichnisse zu erstellen - insbesondere aus einem Shell-Skript, in dem es aufgrund der Möglichkeit von Symlink-Angriffen unmöglich ist, eine Datei sicher in einem freigegebenen Verzeichnis zu erstellen ( mkdirist in Ordnung, wenn Sie Fehler richtig behandeln).

¹ und nicht leer - Wenn die Variable leer ist, ist sie ohnehin nicht verwendbar und es ist im Allgemeinen eine gute Idee, leere oder nicht gesetzte Variablen auf die gleiche Weise zu behandeln, wenn sie einen Dateinamen enthalten sollen.


11
Vielleicht könnten Sie erwähnen, dass Benutzer mit Dateinamenskollisionen rechnen müssen. Daher ist IMO die einzige empfohlene Methode, um Dateien in / tmp zu erstellen, der Befehl, der mktempauch automatisch $ TMPDIR "verarbeiten sollte.
rudimeier

Dies ist die Antwort, die Sie wollen. Ich habe Systeme ohne / bin gesehen, geschweige denn / tmp.
Joshua

1
In A.10 Verzeichnisstruktur und Geräte heißt es außerdem: ... Das /tmpVerzeichnis wird in POSIX.1-2008 beibehalten, um historische Anwendungen aufzunehmen, die von seiner Verfügbarkeit ausgehen. Implementierungen werden aufgefordert, geeignete Verzeichnisnamen in der Umgebungsvariablen anzugeben, TMPDIRund Anwendungen werden aufgefordert, den Inhalt von TMPDIRzum Erstellen temporärer Dateien zu verwenden. ...
Andrew Henle

3
Es ist nur traurig, dass dies mktempnicht in POSIX enthalten ist, obwohl es bereits in den meisten gängigen Betriebssystemen wie GNU (Linux) , OpenBSD , FreeBSD und macOS vorhanden ist .
Franklin Yu

1
Es könnte sich lohnen, hinzuzufügen, dass mktempähnliche Funktionen in vielen Skript- und Programmiersprachen wie libc , Perl und Python verfügbar sind .
Gaurav

6

Obwohl es sehr wahrscheinlich ist, sollten Sie einen anderen Grund prüfen: Es ist nicht garantiert, dass es groß ist . Auf vielen Systemen /tmpwird RAM anstelle von Festplatte verwendet und ist wahrscheinlich auf einige GB beschränkt. (Auf Fedora-Systemen ist es standardmäßig die Hälfte des Arbeitsspeichers.) Sie sollten also nicht nur auf Vorhandensein prüfen, sondern auch prüfen, ob Platz vorhanden ist, was Sie dort ablegen möchten.

Wenn Sie etwas Großes haben, verwenden Sie /var/tmp/.


2
Ich bin nicht sicher, ob es "die Unix-Methode" ist, den verfügbaren Speicherplatz zu überprüfen, bevor Sie fortfahren, zumal nicht immer genau bekannt ist, wie viel Speicherplatz Sie benötigen werden. In jedem Fall müssen Sie darauf vorbereitet sein, einen Schreibfehler ordnungsgemäß zu behandeln, falls das Dateisystem voll werden sollte. und wenn Sie das tun werden, was wird durch eine Vorabprüfung gewonnen, die zu falschen Negativen und Positiven neigt?
Nate Eldredge

2
Hängt davon ab, wie elegant Sie den Fehlerfall behandeln können, denke ich. Der wichtigste Punkt ist, nicht davon auszugehen, dass /tmpgroße Dateien verarbeitet werden können. Angenommen, es handelt sich um einen 10-GB-Download über einen Link mit mäßiger Geschwindigkeit. "Unix way" oder nicht, es ist ziemlich miserabel, mehrere Stunden herauszufinden, dass es nicht funktionieren wird.
mattdm

1
@mattdm Frühes Überprüfen ist nett, aber Fehler müssen behoben werden. Möglicherweise sind in / tmp 10 GB verfügbar, wenn der Download startet, aber ein anderer Benutzer kopiert 5 GB, während der Download ausgeführt wird. Was jetzt? Heh.
Zan Lynx

Bestimmt! Ich meine das nicht als Entschuldigung, um nicht mit Fehlern fertig zu werden.
mattdm

"Wenn Sie etwas Großes haben" - verwenden Sie / tmp und lassen Sie das Betriebssystem bei Bedarf austauschen.
UKMonkey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.