Sollen wir den Inhalt von / tmp manuell löschen?

26

Ich hatte den Eindruck, dass "alte" Dateien in /tmpregelmäßigen Abständen gelöscht werden. Es scheint mir jedoch, dass /tmpnur so lange wachsen wird, wie es will, und nichts wird gelöscht. Einige Leute sagen, es ist besser, in /tmpRuhe zu lassen und den Inhalt nur dann zu löschen, wenn die Festplatte voll ist.

Meine Frage ist, ist /tmpwirklich darauf ausgelegt, sich nicht um sich selbst zu kümmern? Was sind die Best Practices?

IMB
quelle
1
Normalerweise /tmpwird es nach dem Neustart gesäubert, dies hängt jedoch vom dort gemounteten Dateisystem ab. Was df -hheißt das?
Etagenklo

Antworten:

27

Um die Fragen zu beantworten:

  • Soll /tmpautomatisch geleert werden: Ja
  • Sollen wir Dateien /tmpregelmäßig und manuell löschen? Nein , Ihr System wird sich darum kümmern.

Wenn Sie sich fragen dürfen:

  • Kann ich Dateien aus /tmpirgendeinem Grund löschen (Speicherplatz benötigen, Spuren entfernen möchten, etc.): Es kommt darauf an , weiterzulesen .

Der Dateisystem-Hierarchie-Standard (FHS) lautet :

Das Verzeichnis / tmp muss für Programme verfügbar sein, die temporäre Dateien benötigen.

Programme dürfen nicht davon ausgehen, dass Dateien oder Verzeichnisse in / tmp zwischen Aufrufen des Programms erhalten bleiben.

/var/tmp/hat einen ähnlichen Zweck , darf aber beim Neustart nicht gelöscht werden.

Es wird nicht garantiert, dass /tmp/oder /var/tmp/regelmäßig gereinigt werden. Dies kann von Ihrer Distribution und Ihren Einstellungen abhängen, obwohl die meisten Systeme von Zeit zu Zeit eine Bereinigung durchführen. Siehe Kommentar von mike.

Wenn Sie eine Datei in / tmp löschen müssen, prüfen Sie zuerst, ob die Datei verwendet wird. Das geht ganz einfach mit:

lsof /tmp/file_to_delete

Wenn Sie dazu berechtigt sind, wird der Prozess angezeigt, der das Handle für diese Datei enthält, z. B. Prozessname, PID und Dateityp. Um wirklich alle Prozesse anzuzeigen sudo, müssen Sie als Benutzer root vorangehen oder ausgeführt werden .

lsof +D /tmp

zeigt Ihnen alle Dateien /tmpund Verzeichnisse unten ( +D), die aktuell geöffnet sind. Natürlich sollten Sie diese Dateien nicht löschen.

Wenn Sie eine noch geöffnete Datei löschen, ist der Zugriff über den Dateisystem-Namespace zwar nicht mehr möglich, sie ist jedoch für Prozesse mit einem geöffneten Datei-Handle weiterhin vorhanden. Nach dem Schließen dieses Handles kann auf die Datei für diesen Prozess nicht mehr zugegriffen werden. Wenn kein Prozess die Datei mehr geöffnet hat, wird sie endgültig gelöscht. Ein Prozess sollte nicht davon ausgehen, dass die Datei zwischen nachfolgenden openAufrufen überlebt , aber Programmierer sind schlampig, und Sie wissen es nie. Aus diesem Grund ist es nicht so klug , Dateien zu löschen, die noch von einigen Programmen verwendet werden.

trapicki
quelle
Im Allgemeinen ist dies alles ein ausgezeichneter Rat, insbesondere der letzte Absatz. Aber ob ein System tatsächlich / tmp aufräumt, hängt von diesem System ab. In openSUSE ist dies beispielsweise nicht der Fall, es sei denn, Sie konfigurieren es (in / etc / sysconfig oder über YaST). Außerdem wird das persönliche ~ / tmp der Benutzer (falls vorhanden) nicht automatisch gelöscht.
Mike
So ist es immer noch möglich, Dateien zu löschen, die Prozesse geöffnet haben? Und das bringt das Programm nicht zum Absturz? Wo existiert die Datei dann? Kann das Programm noch mit dieser "geöffneten aber gleichzeitig gelöschten" Datei interagieren? Gibt es eine Möglichkeit, die Entfernung der Datei für rm schwierig oder unmöglich zu machen? So etwas wie eine Dateisperre vielleicht?
CMCDragonkai
Dateien sind Datensätze im Dateisystem, die in einem hierarchischen Namensraum über einen Pfad und einen Dateinamen zugänglich gemacht werden. Eine Datei kann mehrere Namen (feste Links) haben, und ein Prozess kann ein offenes Handle für eine Datei haben. Wenn auf die Datei nicht zugegriffen werden kann, dh wenn sie keinen Namen und kein offenes Handle hat, wird sie gelöscht. Das Verhindern eines Löschvorgangs liegt außerhalb meines Fachwissens und der IMO außerhalb des Bereichs dieser Frage. Suchen Sie nach "Mandatary Locking".
Trapicki
[war eine doppelte Antwort]
Trapicki
4

Ich denke das ist OS varientabhängig. Ich würde mir vorstellen, dass / tmp normalerweise beim Neustart gelöscht wird, und in der Tat wäre es für das System nicht sicher, sich während der Sitzung selbst zu bereinigen, da es nicht weiß, welche Dateien aktiv sind.

Wenn Sie mutig sind, möchten Sie möglicherweise einen Befehl in crontab ausführen, der Dateien löscht, die älter als ein bestimmtes Alter sind. Dies kann jedoch zu Problemen führen, wenn noch verwendete Dateien gelöscht werden. Sie könnten versuchen, einen Befehl (ich habe es nicht versucht) wie

find / tmp -type f -ctime +10 -exec rm {} +

Damit werden theoretisch alle Dateien unter / tmp entfernt, die älter als 10 Tage sind.

Davidgo
quelle
hinzufügen sollten wahrscheinlich -rzu diesem
Steven Penny
1
Fügen Sie dazu auf keinen Fall -r hinzu, da dies dazu führt, dass Dateien gelöscht werden, die jünger als 10 Tage sind und sich in Verzeichnissen befinden, die vor mehr als 10 Tagen erstellt wurden. Tatsächlich sollte der Befehl wahrscheinlich / tmp -type f -ctime +10 -exec rm {} + finden, um die Suche auf Dateien zu beschränken. (Wenn Sie den Befehl find verwenden, werden Unterverzeichnisse erneut durchsucht.)
davidgo
1

Die Verzeichnisse / tmp und / var / tmp werden nach einem normalen Zeitplan bereinigt. Dies kann von Ihrer Distribution abhängen. Auf meinem CentOS-System (einem Klon von RedHat) ist ein Cron-Job geplant, um tmpwatch , einen tmp dir cleaner, nach einem täglichen Zeitplan auszuführen . Dateien in / var / tmp dürfen etwas länger als Dateien in / tmp / bleiben. Ich habe auch Skripte gesehen, die / tmp (aber ausdrücklich nicht / var / tmp) bei einem Neustart bereinigen, in dem Wissen, dass diese Datei durch nichts offengehalten werden kann, da alle Prozesse neu sind.

Also, ja, / tmp hat Wartung von grundlegenden Skripten. Es kann sich außerhalb dieser Wartungszeiten noch füllen. Wenn Sie Dinge manuell bereinigen möchten, sollten Sie vorsichtig sein. Sysadmin Lore spricht über Symlinks in / tmp, die auf notwendige Systemdateien verweisen, die gelöscht wurden, als n00b-Sysadmins ein einfaches findSkript ausführten .

Reiche Homolka
quelle
2
Auf Centos 7 und anderen RedHat-ähnlichen Systemen der Version 7+ mit systemd wird die Bereinigung in /usr/lib/tmpfiles.d/tmp.conf konfiguriert. Dies wird vom systemd-Zielsystem d-tmpfiles-clean.service aufgerufen.
Shonky Linux Benutzer
1

In CentOS gibt es einen Job /etc/cron.dailynamens, tmpwatchder rekursiv Dateien entfernt, auf die eine bestimmte Zeit lang nicht zugegriffen wurde. Normalerweise werden damit Verzeichnisse bereinigt, die für temporären Speicherplatz wie / tmp verwendet werden.

Das ist das /etc/cron.daily/tmpwatchDrehbuch

#! / bin / sh
flags = -umc
/ usr / sbin / tmpwatch "$ flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/ tmp / hsperfdata_ *' 10d / tmp
/ usr / sbin / tmpwatch "$ flags" 30d / var / tmp
für d in / var / {cache / man, catman} / {cat?, X11R6 / cat?, local / cat?}; machen
    if [-d "$ d"]; dann
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    fi
getan

/tmp Verzeichnisinhalte werden nur beim Neustart des Systems gelöscht, da der laufende Prozess möglicherweise auf Dateien in diesem Verzeichnis zugreift.

max
quelle
0

Sie können den Inhalt von entfernen /tmp/; Das Problem dabei ist jedoch, dass bei einem Dienst, in den regelmäßig geschrieben /tmp/und die Dateien gelöscht werden, der Dienst abstürzen oder unterbrochen werden kann, bis er neu gestartet wird.


quelle
0

Das FHS definiert das /tmpVerzeichnis als "temporäre Dateien (siehe auch / var / tmp), die häufig zwischen Systemneustarts nicht erhalten bleiben" und /var/tmpals "temporäre Dateien, die zwischen Neustarts erhalten bleiben".

Heutzutage /tmpist ein RAM-Dateisystem (tmpfs) standardmäßig (obwohl optional) in vielen GNU / Linux-Distributionen /tmppraktisch nicht persistent.

(Vermutlich) sollten Anwendungen ihre temporären Dateien entsprechend verwalten, was meiner Meinung nach das Löschen nach Beendigung ihrer Verwendung einschließt und keine Administratoren dazu verpflichtet, mögliche destruktive Löschvorgänge zu planen.

Dawud
quelle
Viele Programme können die Bereinigung von Dateien erheblich verbessern, /tmpwenn sie fertig sind oder wenn sie beendet werden. Es gibt jedoch weiterhin ein Problem mit Dateien, die /tmpnach einem abnormalen Abbruch (Absturz) eines Programms noch vorhanden sind.
Kevin Fegan
0

Wenn Sie Debian (oder ein Derivat wie Ubuntu) ausführen, sollten Sie sich Ihre / etc / default / rcS- Datei ansehen und die TMPTIMEUmgebungsvariable anpassen . Per Definition hat das, was sich in / tmp befindet, beim nächsten Neustart hier nichts zu tun.

ich empfehle

  • Verwenden der TMPTIMEVariablen auf einem Server
  • mount / tmp als tmpfs (im RAM) auf einem Desktop (für mehr Geschwindigkeit)
maxxvw
quelle
0

Die Distributionen sind natürlich unterschiedlich, aber ich erwarte, dass temporäre Dateien vom System automatisch verwaltet werden. Sie würden wahrscheinlich entweder Cron-Jobs oder den systemd-tmpfiles-clean-Dienst verwenden. Wenn Sie sich Sorgen über den Speicherplatz machen, ist dies ein nützlicher Befehl, um zu prüfen, wie viel Speicherplatz jeder Stammordner belegt:

du -hs /* | sort -h

Um festzustellen, ob Ihr System den systemd-Dienst zum Verwalten temporärer Dateien verwendet, können Sie Folgendes versuchen:

systemctl status systemd-tmpfiles-clean

Unten sehen Sie so etwas wie das Folgende, das Ihnen sagt, wann der Service das letzte Mal ausgeführt wurde:

systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static; vendor preset: disabled)
   Active: inactive (dead) since Wed 2018-07-18 15:43:36 IST; 18h ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)
  Process: 30495 ExecStart=/usr/bin/systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
 Main PID: 30495 (code=exited, status=0/SUCCESS)

Jul 18 15:43:36 host-name systemd[1]: Starting Cleanup of Temporary Directories...
Jul 18 15:43:36 host-name systemd[1]: Started Cleanup of Temporary Directories.

Beachten Sie, dass dieser Dienst beendet wird, sobald die Bereinigung abgeschlossen ist. Ein Zeitgeberdienst ist dafür verantwortlich, ihn regelmäßig auszulösen. Sie können es überprüfen mit:

systemctl status systemd-tmpfiles-clean.timer

Und Sie sollten folgendes erwarten:

systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
   Active: active (waiting) since Tue 2018-07-03 10:56:59 IST; 2 weeks 1 days ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)

Jul 03 10:56:59 host-name systemd[1]: Started Daily Cleanup of Temporary Directories.
Jul 03 10:56:59 host-name systemd[1]: Starting Daily Cleanup of Temporary Directories.

Wenn Sie sich noch einmal den eigentlichen Dienst ansehen, der für die Bereinigung der Dateien verantwortlich ist, werden Sie feststellen, dass nur Folgendes ausgeführt wird:

/usr/bin/systemd-tmpfiles --clean

Sie können diesen Befehl also entweder direkt ausführen oder wie folgt vorgehen, um ihn ordnungsgemäß auszuführen:

systemctl start systemd-tmpfiles-clean

Welches wird den entsprechenden Befehl für Ihr System ausführen. Beachten Sie jedoch, dass dies kein Befehl zum Löschen aller temporären Dateien ist. Es gibt verschiedene Konfigurationsdateien, die steuern, was und wann tatsächlich gelöscht wird, damit Anwendungen ihre temporären Dateien individuell konfigurieren können.

Ein Ort, an dem Sie nach einer generischen Behandlung von temporären Dateien suchen sollten /usr/lib/tmpfiles.d/tmp.conf, könnte die folgenden relevanten Zeilen enthalten:

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

Sie können diese in eine kürzere Zeit ändern, wenn auf Ihrem System immer weniger Speicherplatz zur Verfügung steht. Beispiel:

v /tmp 1777 root root 12h
v /var/tmp 1777 root root 1d

man tmpfiles.dLesen Sie das Handbuch, um sicherzugehen, was Sie tun . Auch hier habe ich festgestellt, dass der hier vorgestellte Ansatz für ein CentOS- (RedHat-basiertes) und ein Ubuntu-System relevant ist, aber ich weiß nicht viel über andere Distributionen.

Nagev
quelle