In welchen Ordner soll ich als Entwickler für meine Zwischendateien schreiben?


17

Ich fange an, ein paar Bash-Skripte für mein Projekt zu schreiben, und dazu müssen einige Zwischendateien oder Variablen geschrieben werden.

Ich möchte wissen, auf welche Ordner ich Zugriff haben kann, wenn jemand mein Skript ausführt. Ist es eine gängige Praxis zu verwenden /tmp/? Oder sollte ich etwas anderes benutzen?

Antworten:


21

Ich finde das Filesystem Hierarchy Standard-Dokument von unschätzbarem Wert, wenn ich nach diesem Zeug suche.

Es gibt ein paar Möglichkeiten,

  • / tmp - 'nicht permanente' temporäre Dateien
  • / var / tmp - 'permanente' temporäre Dateien
  • / var / cache - Transiente Datendateien der Anwendung

Es hängt wirklich von der Art der Daten ab, die Sie speichern.


Nutze besser das, was der Benutzer / die Umgebung dir gibt und benutze nur / tmp etc. als Fallback. (was unix.stackexchange.com/a/79776/7784 sagte)
Oluf Lorenzen

15

Wenn Sie temporäre Dateien schreiben müssen, die nur so lange dauern, wie Ihr Skript oder Ihre Anwendung ausgeführt wird, verwenden Sie das Verzeichnis, das von der TMPDIRUmgebungsvariablen angegeben wird, oder wenn diese Variable nicht definiert ist /tmp.

/tmpwird beim Booten auf einigen Systemen gelöscht (manchmal sogar im RAM, z. B. standardmäßig unter Solaris und bei einigen Linux-Installationen), sodass es nicht für Dateien verwendet werden kann, die einen Stromausfall oder einen Neustart überstehen müssen. /var/tmpKann für Dateien verwendet werden, die einen Neustart überstehen müssen, aber von Zeit zu Zeit vom Systemadministrator gesäubert werden. Wenn Ihre Anwendung Dateien dauerhaft speichern muss, schreiben Sie sie irgendwo in das Ausgangsverzeichnis des Benutzers (in ~/.programmingnoobsappoder ~/.cache/programmingnoobsapp) oder unter /var/lib/programmingnoobsappoder /var/cache/programmingnoobsapp.

Beachten Sie, dass dies /tmpvon allen Benutzern gemeinsam genutzt wird. Sie müssen daher Vorsichtsmaßnahmen treffen, wenn Sie dort eine Datei erstellen. Sie müssen einen Dateinamen auswählen, der noch nicht existiert, und Sie müssen darauf achten, dass Sie keine Race-Bedingung zulassen, bei der ein anderer Prozess die vor Ihnen liegende Datei mit unterschiedlichen Berechtigungen erstellt Wenn Sie als ein anderer Benutzer ausgeführt werden, kann er auf die Daten Ihres Prozesses zugreifen und diese ändern. Verwenden Sie den mktempBefehl, um eine Datei in /tmpoder zu erstellen /var/tmp. Erstellt standardmäßig mktempeine Datei in $TMPDIRoder /tmpwenn TMPDIRnicht gesetzt, ist dies normalerweise der richtige Ort. Wenn Sie mehrere temporäre Dateien verwenden müssen oder auch nur eine, empfehle ich, ein Verzeichnis für alle temporären Dateien mit zu erstellenmktemp -d und entfernen Sie es am Ende Ihres Skripts.

#!/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
…

Wenn ich mktemp verwende, entferne ich keine temporären Dateien am Ende meines Skripts. Ich habe einen tmpwatch-Cron-Job, der alte Dateien automatisch entfernt. In den allermeisten Fällen lese ich die Zwischendatei nicht und das System löscht die Dateien von selbst. Wenn jedoch etwas mit dem Skript schief geht, habe ich alle meine Zwischendateien für das einfache Debuggen.
Emory

1
+1 für mktemp. Für mich ist dies die richtige Antwort: Delegieren Sie die Aufgabe des sicheren Erstellens einer temporären Datei an mktemp(siehe diesen Artikel ). Obwohl die eine Antwort, die das zitiert, FHSauch großen Wert hat.
Carlos Campderrós

Warum initialisieren Sie, tmp_rootbevor Sie es zuweisen? Wäre es nicht natürlicher unset?
l0b0

@ l0b0 Beides wird funktionieren (außer unter set -u, aber das ist ungewöhnlich). Es muss vor dem Setzen des Traps (un) auf einen sicheren Wert gesetzt werden, falls das Skript direkt nach dem Setzen des Traps beendet wird.
Gilles 'SO- hör auf böse zu sein'

Ich würde hinzufügen set -o errexit, dass, wenn tmp_rootes in der Umgebung bereits schreibgeschützt ist, es nicht das falsche Verzeichnis zerstört ...
l0b0

2

Nur um die bisher geposteten Antworten zu ergänzen.

Es gibt auch /dev/shmeinige Linux-Distributionen, die für die temporäre Speicherung verwendet werden können. Dieser Speicher sollte nur verwendet werden, wenn die Leistung der Datei-E / A ein kritischer Faktor /dev/shmist, da das tmpfsDateisystem verwendet wird. Es sollte auch für Dateien und Daten mit angemessener Größe verwendet werden. Das tmpfsDateisystem verwendet einen System-RAM als Speicher, so dass er von Start zu Start nicht persistent ist.

Eine gute Übersicht über alle hier auf StackOverflow genannten Optionen finden Sie auch in dieser Frage und Antwort mit dem Titel: / tmp vs. / dev / shm für temporären Dateispeicher unter Linux? . Diese SuperUser-Fragen und Antworten mit dem Titel: Wann sollte ich / dev / shm / und wann / tmp verwenden? .

Verweise


0

Ja, /tmphauptsächlich für Dateien, die vorübergehend benötigt werden. Das / tmp hat Sticky-Bit, was bedeutet, dass nur der Eigentümer des Elements, der Eigentümer des Verzeichnisses oder der Superuser Dateien umbenennen oder löschen können. Viele Programme verwenden dies zum Erstellen von Sperrdateien und zum temporären Speichern von Daten. Bei einigen Distributionen wird dieses Verzeichnis beim Booten oder Herunterfahren gelöscht.


1
Nicht alle / tmp-Verzeichnisse werden beim Booten gelöscht. Beispiel: Standard-AIX-Installationen tun dies nicht (und dies ist UNIX & Linux, nicht nur Linux).
EightBitTony

Wenn es sich jedoch um einen "speicherresidenten" Computer handelt, der in vielen Fällen standardmäßig verwendet wird, verschwindet er, wenn das System aus irgendeinem Grund angehalten wird.
mdpc
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.