Wie wird das Verzeichnis / tmp aufgeräumt?

302

Wie wird das /tmpVerzeichnis aufgeräumt? Ist es automatisch? Wenn ja, wie oft wird es aufgeräumt?

Olivier Lalonde
quelle
15
Meine temporären Dateien werden nie auf die Festplatte geschrieben. Sie werden auf eine RAM-Disk geschrieben. Ich habe tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0/ etc / fstab eingegeben.
Anonym

Antworten:

193

Hinweis! Diese Antwort ist veraltet seit mindestens Ubuntu 14.04. Sehen Sie sich die anderen Antworten für die aktuelle Situation an und stimmen Sie ihnen mit Wut zu, wenn sie sich als richtig erweisen. Schreibe auch einen Kommentar, damit ich hier den Link zu der aktuellen richtigen Antwort setzen kann.

Für 14.04 siehe https://askubuntu.com/a/759048/1366

Für 16.10 siehe https://askubuntu.com/a/857154/453746


Alte Antwort von 2011:

Die Bereinigung /tmperfolgt über das Upstart-Skript /etc/init/mounted-tmp.conf. Das Skript wird bei jedem Mounten von upstart ausgeführt /tmp. Praktisch bedeutet das bei jedem Boot.

Das Skript macht ungefähr Folgendes: Wenn eine Datei /tmpälter als $TMPTIMETage ist, wird sie gelöscht.

Der Standardwert $TMPTIMEist 0, was bedeutet, dass alle Dateien und Verzeichnisse in /tmpgelöscht werden. $TMPTIMEist eine Umgebungsvariable, die in definiert ist /etc/default/rcS.

Lesmana
quelle
Dies gilt nicht mehr für 14.04 (das Skript existiert nicht mehr).
Martin Schröder
@Martin Schröder - das Skript existiert auf meinem System und es ist eine saubere Installation von 14.04 und tmpreaper existiert nicht!
Lance Holland
Ich verwende jetzt Arch Linux, sodass ich nicht überprüfen kann. Es tut uns leid. Bitte jemand überprüfen und kommentieren oder meine Antwort bearbeiten.
Lesmana
4
in Ubuntu 16.04 tmpreaper wird als unsicher aufgegeben, siehe: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha
1
Nein. In Ubuntu 16.04 wird es einfach durch einen systemd-Mechanismus ersetzt. Lesen Sie dieses Dokument, und Sie werden tatsächlich eine Erklärung dafür finden, warum die Sicherheitsanalyse, die Unsicherheit behauptet, fehlerhaft ist.
JdeBP
141

Das Verzeichnis wird standardmäßig bei jedem Start gelöscht, da TMPTIMEes standardmäßig 0 ist.

Hier können Sie die Uhrzeit in der folgenden Datei ändern:

/etc/default/rcS

TMPTIME gibt an, wie oft das tmp dir in Tagen gelöscht werden soll

Max Ruf
quelle
9
Das Löschen bei jedem Start ist nicht ideal für einen Computer, der niemals neu gestartet wird, wie z. B. einen Server. Ich habe über 500.000 Dateien, die 5 GB Speicherplatz in meinem / tmp belegen, da mein Server 378 Tage Betriebszeit hat. Ich zögere, es neu zu starten, nur weil das Löschen dieser Dateien beim Neustart Stunden in Anspruch nimmt.
rjmunro
10
In deinem Fall solltest du tmpreapereine Chance geben.
qbi
1
Ein CRON-Job könnte das leicht lösen.
Ken Sharp
Auch tmpwatchsollte ein geeignetes Werkzeug sein.
ArekBulski
1
Offenbar bietet Ubuntu / systemd bereits eine Lösung. Ich würde mehr sagen, aber ... systemd.
Ken Sharp
65

Während der /tmpOrdner kein Ort zum langfristigen Speichern von Dateien ist, möchten Sie gelegentlich die Dinge ein wenig länger als beim nächsten Neustart aufbewahren , was auf Ubuntu-Systemen der Standard ist. Ich kenne ein oder zwei Male, in die ich /tmpwährend des Testens etwas heruntergeladen , nach Änderungen neu gestartet und dann die ursprünglichen Daten wieder verloren habe. Dies kann geändert werden, wenn Sie Ihre /tmpDateien länger aufbewahren möchten.

Ändern der /tmpAufräumhäufigkeit

Die Standardeinstellung, die Ihr System anweist, /tmpbeim Neustart zu löschen, ist in der /etc/default/rcSDatei enthalten. Der Wert, den wir betrachten, ist TMPTIME.

Der aktuelle Wert von TMPTIME=0sagt, dass Dateien trotz des Alters der Datei beim Neustart gelöscht werden. Durch Ändern dieses Werts in eine andere (positive) Zahl wird die Anzahl der Tage geändert, die eine Datei überleben kann /tmp.

TMPTIME=7

Mit dieser Einstellung können Dateien bis zu /tmpeinem Alter von einer Woche gespeichert und beim nächsten Neustart gelöscht werden. Eine negative Zahl ( TMPTIME=-1) weist das System an, niemals etwas in zu löschen /tmp. Dies ist wahrscheinlich nicht etwas, das Sie wollen, aber verfügbar ist.

hhlp
quelle
1
gute Erklärung. Aber in welchem ​​Skript steht der Bereinigungsbefehl? Ich habe gesehen /etc/init/mounted-temp.conf, aber es hat die Linie start on mounted MOUNTPOINT=/tmp, die mich denken lässt, dass es nicht anwendbar ist.
Enzotib
7
Wenn Sie nicht möchten, dass eine Datei automatisch entfernt wird, legen Sie sie /var/tmpanstelle von ab /tmp.
Gilles
1
Es ist auch praktisch, Dateien aufzubewahren, die Sie nicht verlieren möchten (gerenderte Videoframes), wenn Ihr Computer abstürzt, möglicherweise aufgrund von OOM. Eine bessere Lösung wäre natürlich, das Problem zu beheben. :-)
Ken Sharp
Kann das in Cygwin gemacht werden?
CMCDragonkai
46

Ich überprüfe dies auf Ubuntu 16.10. Ich kann bestätigen, dass die Bearbeitung von / etc / default / rcS keinerlei Auswirkungen mehr hat und die Dateien in tmp durch einen Neustart gelöscht werden, unabhängig davon, was Sie in diese Datei einfügen. Wie andere erwähnen, wird tmpreaper nicht mehr verwendet.

Ich denke, die richtige Antwort ist, dass Ubuntu 16.10 ein neues Setup hat. Es gibt einen Ordner /etc/tmpfiles.d, der in der Manpage "tmpfiles.d" dokumentiert ist. In diesem Ordner sollte eine Konfigurationsdatei abgelegt werden, um zu steuern, ob / tmp gelöscht werden soll. Folgendes tue ich, um zu verhindern, dass Neustarts Dateien in / tmp löschen, sofern sie nicht 20 Tage alt sind:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

Ersetzen Sie "20d" durch "-", wenn Sie niemals möchten, dass Dateien gelöscht werden. Dies ist mein Bestes, diese Manpage ist fast undurchdringlich mit Details.

Der Vorteil des neuen Setups besteht darin, dass ein File Cleaner auch dann ausgeführt werden kann, wenn das System nicht neu gestartet wird (wie bei einem immer auf dem Server befindlichen System). Das ist ein großes Plus, denke ich.

pauljohn32
quelle
5
man tmpfiles.d
Martin Schröder
Ich habe festgestellt, dass Sie die ursprünglichen Dateiberechtigungen und den ursprünglichen Eigentümer beibehalten können, indem Sie Bindestriche verwenden:d /tmp/ - - - 20d
Dave Yarwood
2
Ebenfalls erwähnenswert: Sie können Ihre Konfiguration testen, indem Sie den Reinigungsjob manuell systemctl start systemd-tmpfiles-clean
ausführen
@ pauljohn32 gilt das auch für versionen nach 16.10?
Kapad
3
@kapad: Ich habe gerade überprüft, dass dies auch auf Ubuntu 18.04 funktioniert.
Gene Vincent
26

In Ubuntu 14.04 wird dies von gemacht tmpreaper, was täglich von cron (from /etc/cron.daily) aufgerufen wird . Das Programm kann über /etc/default/rcSund konfiguriert werden /etc/tmpreaper.conf.

Martin Schröder
quelle
Auf meinem System war tmpreaper nicht in /etc/cron.daily - aber ich konnte es mit apt-get installieren
Joe Germuska
10

Vor dem 14.04 .:

Es wird bei jedem Neustart bereinigt.

Utku Demir
quelle
Ab 14.04 wird nur tmpreaper verwendet, nicht das "per boot" -Skript FWIW
Rogerdpack
Meine 14.04-Systeme räumen alle beim Neustart auf. Ich habe noch nie davon gehört tmpreaper.
Ken Sharp
Was passiert, wenn Sie das System nie neu starten?
Phuclv
8

In einem systemdUbuntu (15.10 und neuer) wird dies von systemd unter Verwendung des systemd-tmpfiles-cleanDienstes und des Timers durchgeführt:

$ systemctl cat systemd-tmpfiles-clean.service 
# /lib/systemd/system/systemd-tmpfiles-clean.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs.target time-sync.target
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/systemd-tmpfiles --clean
IOSchedulingClass=idle

Und

$ systemctl cat systemd-tmpfiles-clean.timer  
# /lib/systemd/system/systemd-tmpfiles-clean.timer
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Also systemd-tmpfiles-cleanläuft beim runterfahren und einmal am Tag anders. Die Dateien , die es reinigt kann erweitert werden , unter Verwendung der /etc/tmpfiles.din den genannten anderen Antwort .

Sie können das Timerverhalten selbst mit systemctl edit systemd-tmpfiles-clean.timerund mit verschiedenen TimerSystemkonfigurationsoptionen ändern (siehe man 5 systemd.timer).

muru
quelle
Ich habe den Timer auf 20 Minuten geändert, und ich sehe, dass der Statusbefehl anzeigt, dass er tatsächlich die 20-Minuten-Konfiguration verwendet. aber mein problem ist das /tmpimmer noch nicht aufgeräumt. und ich brauche es, um aufgeräumt zu werden. Selbst ein manueller Start sudo systemctl start systemd-tmpfiles-cleanreicht nicht aus. Irgendwelche Ideen warum?
User2932688
4

Auf einem unserer Server mit Ubuntu haben wir ein Skript zum Entfernen von Dateien in / tmp, das jede Nacht ausgeführt wird.

Das Skript lautet:

#!/bin/sh
# Clean file and dirs more than 3 days old in /tmp nightly

/usr/bin/find /tmp -type f -atime +2 -mtime +2  |xargs  /bin/rm -f &&

/usr/bin/find /tmp -type d -mtime +2 -exec /bin/rm -rf '{}' \; &&

/usr/bin/find /tmp -type l -ctime +2 |xargs /bin/rm -f &&

/usr/bin/find -L /tmp -mtime +2 -print -exec rm -f {} \;

Speichern Sie einfach den Inhalt in einer Datei, und erstellen Sie einen Cron-Eintrag, um die Datei auszuführen. Da dies ein Webserver ist, möchten wir ihn aus offensichtlichen Gründen nicht neu starten.

Paul
quelle
6
Mit tmpwatch könnten Sie besser dran sein .
Poolie
9
Die letzte Zeile ist extrem gefährlich. Normalerweise kann jeder rennen ln -s /usr /tmp/kaboomoder sogar ln -s /* /tmp/...
Daniel Alder