Come ripulire la cartella tmp in modo sicuro su Linux


14

Uso la RAM per il mio tmpfs / tmp, 2 GB, per essere esatti. Normalmente, questo è sufficiente, ma a volte i processi creano file e non riescono a ripulire da soli. Questo può accadere se si bloccano. Devo eliminare questi file orfani di tmp, altrimenti il ​​futuro processo esaurirà lo spazio su / tmp.

Come posso tranquillamente garbage collection / tmp? Alcune persone lo fanno controllando il timestamp dell'ultima modifica, ma questo approccio non è sicuro perché possono esserci processi di lunga durata che necessitano ancora di quei file. Un approccio più sicuro consiste nel combinare l'ultima condizione data / ora della modifica con la condizione che nessun processo abbia un handle di file per il file. Esiste un programma / script / etc che incarna questo approccio o qualche altro approccio che è anche sicuro?

Per inciso, Linux / Unix consente una modalità di apertura del file con la creazione in cui il file creato viene eliminato al termine del processo di creazione, anche se proviene da un arresto anomalo?


Controlla se potresti usare tmpfs invece di / tmp: kernel.org/doc/Documentation/filesystems/tmpfs.txt
ott--

Risposte:


15

Potresti provare qualcosa del genere:

find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'

find viene utilizzato per trovare file che soddisfano determinati criteri.

  • -mtime +7 seleziona solo file più vecchi di 7 giorni (è possibile utilizzare qualsiasi altro valore)
  • -exec fuser -s {} ';'chiama il fusore in modalità silenziosa per ogni file che soddisfa i criteri di vecchiaia. il fusore restituisce 0 (= vero) per ogni file a cui si è avuto accesso in questo momento e 1 (= falso) per quelli non acceduti. Dato che siamo interessati solo a coloro che non sono stati accolti, ci siamo messi -notdi fronte-exec
  • -exec echo {} ';'stampa solo tutti i nomi dei file corrispondenti ai criteri. potresti preferire l'uso -exec rm {} ';'qui, ma poiché ciò potrebbe eliminare alcuni file ancora in uso, penso che sia più sicuro fare prima una semplice eco.
  • modifica: potresti voler aggiungere qualcosa di simile -name 'foo*.bar'o -uid 123limitare gli effetti della pulizia a specifici pattern di file o ID utente per evitare effetti accidentali.

All'ultimo punto: considera che potrebbero esserci file scritti una sola volta (ad es. All'avvio del sistema) ma letti frequentemente (ad es. Qualsiasi X-session-cookie). Pertanto consiglio di aggiungere alcuni controlli del nome per influire solo sui file creati dai programmi difettosi.

edit2: Alla tua ultima domanda: un file non verrà eliminato dal disco finché nessun processo ha un handle aperto (almeno per i filesystem linux nativi). Il problema è che la voce della directory viene rimossa immediatamente, il che significa che dal momento in cui rimuovi il file nessun nuovo processo può più aprire il file (poiché non è associato alcun nome file).

Per i dettagli, consultare: /programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux

edit3: Ma se volessi automatizzare l'intero processo?

Come ho detto, potrebbero esserci dei file che vengono scritti una volta e poi letti ogni tanto (ad es. Cookie di sessione X, file PID, ecc.). Questi non saranno esclusi da questo piccolo script di rimozione (che è il motivo per cui potresti voler eseguire un test echoprima di eliminare effettivamente i file).

Un modo per implementare una soluzione sicura è utilizzare atime.
atimememorizza l'ora dell'ultimo accesso a ciascun file. Ma quell'opzione del file system è spesso disabilitata perché ha un certo impatto sulle prestazioni (secondo questo blog da qualche parte nella regione del 20-30%). C'è relatime, ma quello scrive solo il tempo di accesso se mtimeè cambiato, quindi questo non ci aiuterà.

Se vuoi usarlo atime, ti consiglio di avere /tmpsu una partizione separata (idealmente un ramdisk) in modo che l'impatto sulle prestazioni sull'intero sistema non sia troppo grande.

Una volta atimeabilitato, tutto ciò che devi fare è sostituire il -mtimeparametro nella riga di comando sopra con -atime.
Potresti essere in grado di rimuovere il -not -exec fuser -s {} ';', ma lo terrei lì solo per essere sicuro (nel caso in cui le applicazioni mantengano i file aperti per un lungo periodo di tempo).

Ma tieni a mente di testare il comando usando echoprima di finire per rimuovere cose di cui il tuo sistema ha ancora bisogno!


simpatico. Che dire dei file chiusi da un lungo processo mentre non li aggiorna? Se si tratta di file di contesto, è possibile perdere il contesto del processo (è vero, non un processo molto intelligente, ma è necessario conoscere gli effetti collaterali previsti di una /tmp/pulizia "laterale" ).
nik,

Questo è il problema di questo approccio (come ho sottolineato nell'ultimo paragrafo). L'approccio migliore qui sarebbe quello di aggiungere controlli uid / gid o file pattern (modificato la risposta di conseguenza)
mreithub,

Questo dovrebbe essere inserito in uno script cron ...?
CMCDragonkai,

@CMCDragonkai Naturalmente puoi metterlo in crontab. Ma come ho già detto, potrebbero esserci dei file a cui si accede ma non sono scritti e quindi potrebbero non essere filtrati da questo piccolo script. Ecco perché è più sicuro stampare prima l'elenco dei file interessati e quindi decidere se eliminarli o meno. Se il tuo /tmpè su una partizione separata (es. Un ramdisk), puoi abilitarlo atimee usare il -atimeparametro di find.
mreithub,

Sto programmando di farlo su un server. Pertanto non posso essere lì per contare tutti i file in tmp per tutto il tempo. Ci sarebbero problemi? Inoltre ho pensato che dovevamo usare il relatime e non il tempo?
CMCDragonkai,

4

Non rotolare il tuo.

Debian / Ubuntu hanno tmpreaper, probabilmente è disponibile anche in altre dist.

# tmpreaper - cleans up files in directories based on their age

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

Nel /etc/tmpreaper.conffile, se imposto entrambi /tmpe /var/tmpcome le directory di pulizia, posso raccomandare a lungo di TMPREAPER_TIMErimuovere il parametro o il massimo fa dei file tmp? Ho sentito che è meglio mantenere un'età più lunga per i /var/tmpfile che per i /tmpfile. Ma se possono essere impostati solo con la stessa età massima, non ne ho idea.
Xiaodong Qi

2

Per quanto riguarda l'ultima parte della tua domanda:

Anche se non credo che esista una modalità di apertura / creazione 'delete-this-if-I-die', un processo può eliminare in modo sicuro un file direttamente dopo averlo creato, purché mantenga aperto un handle per detto file. Il kernel manterrà quindi il file su disco e non appena uscirà l'ultimo processo che ha aperto il file (sia esso in crash o normalmente), lo spazio occupato dal file verrà liberato.

Per un modo generale di aggirare il problema che alcuni processi a volte non puliscono / tmp, suggerirei di dare un'occhiata agli spazi dei nomi mount, descritti, ad esempio qui o qui . Se il processo in questione è un demone di sistema, systemd e la sua funzione nativa per consentire i filesystem privati ​​/ tmp potrebbero essere interessanti.



0

Ottieni un elenco di file più vecchi di così, quindi escludi i file che sono aperti da qualsiasi cosa da tale elenco:

find /tmp -mtime +7 |\
    egrep -v "`lsof -n +D /tmp | awk 'NR>1 {print $9}'| tr \\n \|`" 

lsof -n +D /tmp: cerca i file aperti in / tmp
awk 'NR>1 {print $9}': stampa solo la nona colonna dell'output lsof, escluse le intestazioni
tr \\n \|: sostituisci la nuova riga con la barra (OPPURE in egrep)
egrep -v "foo|moo|bar": stampa le righe NON contenenti foo o moo o bar


0

Sono d'accordo con quanto sopra, da aggiungere comunque- Corro sempre lsof +L1 | grep tmpe uccido o riavvio i processi trattenendo i file tmp "cancellati": ESEMPIO-

# lsof +L1 | grep tmp
xfce4-ter  1699  user   32u   REG    8,6      192     0 818552 /tmp/vte966VLX (deleted)
chrome     3301  user  138u   REG    8,6    16400     0 818547 /tmp/etilqs_Z0guKD7p6ork9iG (deleted)

2
SU organizza casualmente i post, quindi non c'è sopra o sotto. A quale post ti riferisci?
Journeyman Geek

0

Potresti semplicemente fare rm -rf /tmp/*e sperare che nulla si rompa ...


1
Suggerire di fare qualcosa "e sperare che non si rompa nulla" non risponde davvero ai PO "c'è un modo sicuro per farlo. Forse potresti approfondire il motivo per cui il tuo suggerimento è sicuro?
bertieb

@bertieb Un buon punto. Probabilmente è sicuro se non viene eseguito come root, ma ...
Solomon Ucko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.