Ich habe ein Programm, das temporäre Dateien erzeugen muss. Es ist für Cluster-Computer geschrieben.
Wenn ich diese Dateien in einem systemweiten temporären Verzeichnis (z. B.:) gespeichert habe /tmp
, haben sich einige Benutzer beschwert, dass das Programm fehlgeschlagen ist, weil sie keinen ordnungsgemäßen Zugriff auf / tmp hatten. Aber wenn ich diese Dateien im Arbeitsverzeichnis speicherte, beschwerten sich diese Benutzer auch, dass sie diese mysteriösen Dateien nicht sehen wollten.
Welches ist eine bessere Praxis? Sollte ich darauf bestehen, dass das Speichern unter /tmp
die richtige Vorgehensweise ist, und alle Fehler als "bestimmungsgemäß funktionieren" verteidigen (dh Ihren Administrator nach der richtigen Erlaubnis / dem richtigen Zugriff fragen)?
quelle
/tmp
Benutzer auf einem Unix-ähnlichen System keinen Zugriff hatten , ist es falsch konfiguriert. Der Superuser sollte so etwas tunchmod 1777 /tmp
./tmp/
, den Sie stattdessen verwenden sollten. Siehe einige der Antworten;)Antworten:
Temporäre Dateien müssen aus verschiedenen Gründen im temporären Verzeichnis des Betriebssystems gespeichert werden:
Das Betriebssystem macht es sehr einfach, diese Dateien zu erstellen und gleichzeitig sicherzustellen, dass ihre Namen eindeutig sind .
Die meisten Sicherungsprogramme kennen die Verzeichnisse mit den temporären Dateien und überspringen diese. Wenn Sie das aktuelle Verzeichnis verwenden, kann dies wichtige Auswirkungen auf die Größe inkrementeller Sicherungen haben, wenn Sicherungen häufig durchgeführt werden.
Das temporäre Verzeichnis befindet sich möglicherweise auf einer anderen Festplatte oder im RAM, wodurch der Lese- / Schreibzugriff erheblich beschleunigt wird .
Temporäre Dateien werden häufig während des Neustarts gelöscht (wenn sie sich auf einer Ramdisk befinden, gehen sie einfach verloren). Dies verringert das Risiko eines unendlichen Wachstums, wenn Ihre App die temporären Dateien nicht immer korrekt entfernt (zum Beispiel nach einem Absturz).
Das Bereinigen von temporären Dateien aus dem Arbeitsverzeichnis kann leicht zu Problemen führen, wenn die Dateien zusammen mit Anwendungs- und Benutzerdateien gespeichert werden. Sie können dieses Problem abmildern, indem Sie ein separates Verzeichnis im aktuellen Verzeichnis erstellen. Dies kann jedoch zu einem anderen Problem führen:
Auf einigen Plattformen ist die Pfadlänge möglicherweise zu lang. Beispielsweise sind unter Windows die Pfadbeschränkungen für einige APIs, Frameworks und Anwendungen schrecklich . Dies bedeutet, dass Sie diese Grenze leicht überschreiten können, wenn sich das aktuelle Verzeichnis bereits tief in der Baumstruktur befindet und die Namen Ihrer temporären Dateien zu lang sind.
Auf Servern wird das Wachstum des temporären Verzeichnisses häufig sofort überwacht . Wenn Sie ein anderes Verzeichnis verwenden, wird es möglicherweise nicht überwacht, und die Überwachung der gesamten Festplatte hilft nicht leicht herauszufinden, dass es die temporären Dateien sind, die immer mehr Platz einnehmen.
Vergewissern Sie sich, dass das Betriebssystem eine temporäre Datei für die Zugriffsverweigerungsfehler erstellt. Das Betriebssystem kann zum Beispiel wissen, dass für einen bestimmten Benutzer ein anderes Verzeichnis als
/tmp
oderC:\Windows\temp
verwendet werden sollte; Wenn Sie also direkt auf diese Verzeichnisse zugreifen, kann es tatsächlich zu einem Fehler kommen, bei dem der Zugriff verweigert wird.Wenn Ihnen der Zugriff verweigert wird, obwohl Sie den Betriebssystemaufruf verwenden, bedeutet dies einfach, dass der Computer schlecht konfiguriert wurde. Dies wurde bereits von Blrfl erklärt . Es ist Aufgabe des Systemadministrators, den Computer zu konfigurieren. Sie müssen Ihre Bewerbung nicht ändern.
Das Erstellen temporärer Dateien ist in vielen Sprachen unkompliziert. Einige Beispiele:
Bash:
Python:
C #:
PHP:
Rubin:
Beachten Sie, dass in einigen Fällen, z. B. in PHP und Ruby, die Datei entfernt wird, wenn das Handle geschlossen wird. Dies ist ein zusätzlicher Vorteil der Verwendung der mit der Sprache / dem Framework gebündelten Bibliotheken.
quelle
fopen("/tmp/mytmpfile", "w");
sollte ich statt zB einen Systemaufruf machen, um temporäre Dateien zu verarbeiten?tmpfile(3)
, um Ihre temporären Dateien zu generieren, oder zumindest,mktemp(3)
um die Dateinamen zu erstellen.Es gibt Standards dafür, und das Beste, was Sie tun können, ist, sie einzuhalten.
POSIX, auf das so gut wie jedes Nicht-Mainframe-Betriebssystem von beliebiger Bedeutung folgt, verfügt über Vorkehrungen zum Erstellen eindeutig benannter temporärer Dateien in einem Verzeichnis unter Verwendung von Standardwerten, die von der Umgebung neu konfiguriert werden können:
stdio.h
Header kann optional einP_tmpdir
Makro enthalten, das das temporäre Verzeichnis des Systems benennt.TMPDIR
ist die kanonische Umgebungsvariable zum Ändern des Speicherorts temporärer Dateien. Vor POSIX wurden andere Variablen verwendet, daher tendiere ich dazu, die erste davon zu verwenden, oderTMP
-TEMPDIR
undTEMP
das hat einen Wert - die Standardeinstellung des Systems zu verwenden, wenn keine vorhanden ist.mkstemp()
undtempfile()
werden eindeutige temporäre Dateien generiert.Wenn Ihren Benutzern die Möglichkeit verweigert wird, temporäre Dateien zu erstellen, ist das System entweder falsch konfiguriert oder die Administratoren stellen nicht klar, welche Richtlinien diesbezüglich gelten. In diesen Fällen können Sie mit Bestimmtheit sagen, dass Ihr Programm einem etablierten Portabilitätsstandard entspricht und dass sein Verhalten mithilfe der vom Standard angegebenen Umgebungsvariablen geändert werden kann.
quelle
P_tmpdir
ist kein Teil vonstdio.h
im Sinne der C-Sprachspezifikation. Es kann durch POSIX oder SVID definiert werden.pam_tmpdir
- dies setztTMPDIR
undTMP
für jeden Benutzer anders zu sein, für Robustheit und Datenschutz. Es ist auch nützlich,TMPDIR
einen einzelnen Befehl festlegen zu können. Wenn Sie Ihr übliches temporäres Verzeichnis aus Gründen der Geschwindigkeit in einem RAM-Dateisystem haben, müssen Sie dies möglicherweise für Befehle ausführen, die große temporäre Dateien generieren (z. B. einen Riesensort
). Ignorieren Sie nicht die Standards / Konventionen, die Ihre Benutzer erwarten!Das temporäre Dateiverzeichnis ist stark vom Betriebssystem / der Umgebung abhängig. Zum Beispiel ist ein temporäres Verzeichnis des Webservers aus Sicherheitsgründen vom temporären Verzeichnis des Betriebssystems getrennt.
Unter MS-Windows hat jeder Benutzer ein eigenes Temp-Verzeichnis.
Sie sollten hierfür createTempFile () verwenden, wenn eine solche Funktion verfügbar ist.
quelle
Die vorherigen Antworten sind zwar korrekt, gelten jedoch nicht für die meisten großen Computercluster.
Computercluster folgen nicht immer den Standardkonventionen für Computer, normalerweise aus guten Gründen, und es macht keinen Sinn, dies mit den Systemadministratoren zu besprechen.
Ihr aktuelles Verzeichnis bezieht sich auf das zentrale Dateisystem, auf das über das Netzwerk zugegriffen wird. Dies ist nicht nur langsam, sondern belastet auch das System für den Rest der Benutzer. Sie sollten es daher nicht verwenden, es sei denn, Sie schreiben nicht viel und Sie können es wiederherstellen, wenn der Job abstürzt.
Die Rechenknoten verfügen über eine eigene Festplatte, das ist das schnellste verfügbare Dateisystem, und was Sie verwenden sollten. In der Cluster-Dokumentation sollte angegeben werden, um was es sich in der Regel
/scratch
handelt/tmp/[jobid]
oder um eine nicht standardmäßige Umgebungsvariable ($SNIC_TMP
in einer der von mir verwendeten).Also, was ich empfehle, ist es benutzerkonfigurierbar zu machen. Die Standardeinstellungen können die ersten sein, auf die Sie Schreibzugriff haben:
$TMPDIR
tmpfile
/tmp
.
Erwarten Sie bei diesem Ansatz jedoch eine geringe Erfolgsquote und geben Sie eine große Fettwarnung aus.
Bearbeiten: Ich werde einen weiteren Grund hinzufügen, um die Benutzereinstellung zu erzwingen. Einer meiner Cluster ist
$TMPDIR
auf "/scratch
Vom Benutzer beschreibbar" und auf der lokalen Festplatte eingestellt. Die Dokumentation besagt jedoch, dass alles, was Sie außerhalb von schreiben,/scratch/[jobid]
jederzeit gelöscht werden kann, selbst mitten in der Ausführung. Wenn Sie sich also an die Standards halten und vertrauen$TMPDIR
, stoßen Sie auf zufällige Abstürze, die sich nur schwer debuggen lassen. Sie können es also akzeptieren$TMPDIR
, aber nicht vertrauen.Bei einigen anderen Clustern ist diese Variable ordnungsgemäß konfiguriert, sodass Sie eine Option hinzufügen können, um explizit zu vertrauen
$TMPDIR
. Andernfalls wird eine große, fette Warnung ausgegeben.quelle
Bei vielen Anwendungen sollten Sie in Erwägung ziehen, temporäre Dateien in
$XDG_RUNTIME_DIR
oder zu speichern$XDG_CACHE_HOME
(die anderen XDG-Verzeichnisse gelten für nicht temporäre Dateien). Anweisungen zu deren Berechnung, wenn sie nicht explizit in der Umgebung übergeben werden, finden Sie in der XDG-basierten Spezifikation oder in einer Bibliothek, die diesen Teil bereits implementiert.Beachten Sie jedoch, dass dies
$XDG_RUNTIME_DIR
eine Neuerung ist und es aus Sicherheitsgründen keinen Standard-Fallback für ältere Systeme gibt.Wenn beides nicht passt,
/tmp
ist es der richtige Ort. Sie sollten niemals davon ausgehen, dass das aktuelle Verzeichnis beschreibbar ist.quelle
Dies ist eher eine Alternative, aber Sie können die Verknüpfung () der Datei sofort nach fopen () aufheben. Es kommt auf das Nutzungsverhalten an.
Das Aufheben der Verknüpfung der Dateien kann auf verschiedene Arten erfolgen:
Dateien müssen in / tmp erstellt werden. Wenn der Benutzer keine Rechte hat, um dort eine Datei zu erstellen, bedeutet dies, dass das System falsch konfiguriert ist.
Dateien können nicht im Home-Verzeichnis des Benutzers erstellt werden. Viele Benutzer, wie "nobody", "www-data" und viele andere, haben keine Rechte, in ihre Home-Verzeichnisse zu schreiben, oder sie sind sogar chroot () - ed. Beachten Sie, dass selbst in der Chroot-Umgebung / tmp noch vorhanden ist.
quelle