Wie verhindere ich, dass ein Ordner in / tmp bereinigt wird?

12

Diese Frage bezieht sich auf Ubuntu 14.10 auf meinem Entwickler-Laptop.

Ich habe einen Ordner darin /tmp, der von einer Anwendung verwendet wird, um temporäre Inhalte dort abzulegen. Diese Anwendung erstellt normalerweise einen temporären Ordner in meinem Homedir und löscht ihn anschließend. Aus irgendeinem Grund funktioniert das nicht, wenn das Homedir verschlüsselt ist. Also habe ich stattdessen einen Symlink zu /tmp/foomeinem Homedir erstellt. Meine Anwendung kann dort schreiben und den temporären Unterordner erstellen.

Jetzt /tmp/foowird jedes Mal gelöscht, wenn ich meinen Computer neu starte. Bisher habe ich den Ordner nach dem Neustart nur manuell neu erstellt. Jetzt habe ich gelernt, wie das / tmp-Verzeichnis aufgeräumt wird. dass es einen Job gibt, der das macht.

Ich habe es mir angeschaut, /etc/init/mounted-tmp.confaber mein Bashfu und besonders mein Fundfu reichen nicht aus, um das zu tun, was ich will. Hier ist ein Auszug aus dieser Datei:

   EXCEPT='! -name .
            ! ( -path ./lost+found -uid 0 )
            ! ( -path ./quota.user -uid 0 )
            ! ( -path ./aquota.user -uid 0 )
            ! ( -path ./quota.group -uid 0 )
            ! ( -path ./aquota.group -uid 0 )
            ! ( -path ./.journal -uid 0 )
            ! ( -path ./.clean -uid 0 )
            ! ( -path "./...security*" -uid 0 )'

   # Remove all old files, then all empty directories
   find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete
   find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete

Was ich tun möchte, ist eine Bedingung hinzuzufügen, die bewirkt /tmp/foo, dass alles in mir gelöscht wird , aber nicht sich /tmp/fooselbst. Wie mache ich das?

simbabque
quelle
Ist /tmp/fooein Verzeichnis oder eine Datei?
Terdon
Ein Verzeichnis. Es sind Dateien drin.
Simbabque
Warum nicht fügen mkdir /tmp/fooRecht vor end script?
Hagen von Eitzen
Nur zu Ihrer Information (das wissen Sie vielleicht schon): 14.10 erreicht EOL im Juli 2015, daher sollten Sie so schnell wie möglich ein Upgrade auf Vivid durchführen.
Léo Lam

Antworten:

20

/etc/init/mounted-tmp.confist Teil des mountallPakets, daher werden alle Aktualisierungen dieses Pakets und die vorgeschlagenen Änderungen rückgängig gemacht.

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

Stattdessen nach dem Filesystem Hierachy Standard (FHS) ;

In Bezug auf / tmp :

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

In Bezug auf / var / tmp :

Das Verzeichnis / var / tmp wird für Programme verfügbar gemacht, die temporäre Dateien oder Verzeichnisse benötigen, die zwischen Systemneustarts erhalten bleiben. Daher sind Daten, die in / var / tmp gespeichert sind, beständiger als Daten in / tmp.

Sie sollten also Ihren symbolischen Link ändern, um ihn /var/tmpanstelle von zu verwenden /tmp.

mgor
quelle
3
Ein klassisches Beispiel dafür, dass mit einem Hammer alles wie ein Nagel aussieht.
WernerCD
@WernerCD könntest du erläutern, was du damit meinst? Wollen Sie damit sagen, dass /var/tmpdas keine gute Idee ist?
Simbabque
6
Wenn alles, was Sie haben, ein Hammer ist ... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.Ich sage, dass das OP / tmp für etwas verwendet, wofür es nicht gedacht ist -tmp Zeug. / var / tmp ist BEDEUTET, zwischen Neustarts aufbewahrt zu werden, daher ist es die richtige Antwort.
WernerCD
8

Nicht unbedingt eine Antwort auf Ihre Frage, aber vielleicht finden Sie /var/tmp einen geeigneteren Ort, da dieser bei einem Neustart nicht bereinigt wird. Es wurde für temporäre Dateien entwickelt, die nach kurzer Zeit nicht automatisch gelöscht werden sollen.

Was ich jedoch oft mache, ist, selbst einen Ordner unter / opt zu erstellen, um zufällige Dinge zu speichern, die ich nicht zuhause haben möchte. Dies ist ein geeigneter Ort, um Dinge zu platzieren, die außerhalb der Kontrolle des Hauptbetriebssystems liegen.

Andrew Aylett
quelle
Das ist die richtige Idee. Wenn / tmp nicht das tut, was Sie wollen, speichern Sie Ihre Informationen an einem anderen Ort - auch auf einem anderen Laufwerk, wenn Speicherplatz verfügbar ist. Verwirren Sie nicht mit Dingen, von denen Linux (und andere Programmierer) erwarten, dass sie auf eine bestimmte Weise funktionieren, es sei denn, dies ist der einzige Weg, um das gewünschte Ergebnis zu erzielen.
Joe
6

Wie so:

EXCEPT='! -name .
            ...
            ! ( -path "./foo" )'

   # Remove all old files, then all empty directories
   ...
   find /tmp/foo/* -depth -xdev $TEXPR -delete

Beispiel:

$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$

Ich stimme dem Benutzer aap zu: Entweder sollten Sie dies in der verwendeten Software berücksichtigen, indem Sie das Verzeichnis dort neu erstellen, wenn es sich um tmp-Dateien handelt, oder ein anderes Verzeichnis verwenden, wenn es sich nicht um tmp-Dateien handelt, die nicht gelöscht wurden.

Rinzwind
quelle
Das funktioniert eigentlich nicht. Während der findBefehl bei manueller Ausführung wie erwartet funktioniert, wird das Verzeichnis nach der Bearbeitung immer noch entfernt /etc/init/mounted-tmp.conf. Anscheinend ist hier noch etwas los.
Terdon
wth. ähm. Das sollte bedeuten, dass die 1. Zeile fehlerhaft ist. Vielleicht muss es relativ sein (?)
Rinzwind
@terdon ja scheint es muss relativ zu / tmp /
Rinzwind
Ich glaube nicht, ich habe verschiedene Permutationen ausprobiert, einschließlich -path ./foound sogar, -name '*foo*'und keine davon funktionierte (auf Ubuntu Server 14.04). Ich denke, das ist einfach nicht die richtige Datei und wir suchen am falschen Ort. Was Sie vorschlagen, sollte funktionieren, es scheint einfach nicht zu funktionieren.
Terdon
0

Es ist eine schlechte Idee, Dateien mit zukünftigem Wert in das Verzeichnis / tmp zu schreiben (/ var / tmp ist, wie von anderen empfohlen, ein besserer Ort). Das heißt, möchten Sie vielleicht eine Chance auf chattr geben. Dies sollte ausgeführt werden, nachdem die Anwendung beendet wurde, jedoch vor dem Herunterfahren. Denken Sie daran, dass diese Operation nichts zulässt in dieses Verzeichnis geschrieben werden kann.

Tippen Sie auf /tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me

Hopfender Hase
quelle
Wie wäre das sinnvoll, wenn ich ein temporäres Verzeichnis haben möchte?
Simbabque
-1

Führen Sie Folgendes aus:

echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel 

dann füge dies zu / etc / inittab hinzu siehe hier: wo ist die inittab Datei? :

foo:2345:boot:/bin/foodel

Dadurch wird beim Booten / etc / foo erstellt, wenn es nicht vorhanden ist, und dann leer.

Dies wird auch beim Bash-Login der Fall sein:

echo "/bin/foodel" >> ~/.bashrc
Daniel
quelle
Ubuntu Version 14 wird nicht verwendet /etc/inittab. Dies ist klar und eindeutig auf seiner Handbuchseite angegeben.
JdeBP,
* facepalm * Sorry @JdeBP, das passiert mir nach dem Jonglieren von 4 verschiedenen Linux-Versionen. Er kann den Code an einer
Daniel