GNU/Linux >> Linux Esercitazione >  >> Linux

Come pulire la cartella tmp in modo sicuro su Linux

Potresti provare qualcosa del genere:

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

find viene utilizzato per trovare file che corrispondono a determinati criteri.

  • -mtime +7 seleziona solo i file più vecchi di 7 giorni (puoi usare qualsiasi altro valore)
  • -exec fuser -s {} ';' chiama fuser in modalità silenziosa per ogni file che corrisponde ai criteri di obsolescenza. fuser restituisce 0 (=true) per ogni file a cui è stato effettuato l'accesso in questo momento e 1 (=false) per quelli non accessibili. Dato che siamo interessati solo a quelli non accessibili, inseriamo un -not davanti a questo -exec
  • -exec echo {} ';' stampa solo tutti i nomi di file che corrispondono ai criteri. potresti voler usare -exec rm {} ';' invece qui, ma poiché ciò potrebbe eliminare alcuni file ancora in uso, penso che sia più sicuro fare prima un semplice eco.
  • modifica: Potresti voler aggiungere qualcosa come -name 'foo*.bar' o -uid 123 per limitare gli effetti della pulizia a specifici pattern di file o ID utente per evitare effetti accidentali.

Per l'ultimo punto:considera che potrebbero esserci file che vengono scritti solo una volta (ad esempio all'avvio del sistema) ma letti frequentemente (ad esempio qualsiasi X-session-cookie). Pertanto raccomando di aggiungere alcuni controlli del nome per influenzare solo i file creati dai tuoi programmi difettosi.

edit2: Alla tua ultima domanda:un file non verrà eliminato dal disco fino a quando nessun processo avrà 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 c'è alcun nome file associato).

Per i dettagli vedere:https://stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux

modifica3: Ma se volessi automatizzare l'intero processo?

Come ho detto, potrebbero esserci file che vengono scritti una volta e poi letti di tanto in tanto (ad esempio cookie di sessione X, file PID, ecc.). Quelli non saranno esclusi da questo piccolo script di rimozione (che è il motivo per cui potresti voler eseguire un test con echo prima di eliminare effettivamente i file).

Un modo per implementare una soluzione sicura è usare atime .
atime memorizza 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 usare atime , consiglierei di avere /tmp su una partizione separata (idealmente un ramdisk) in modo che l'impatto sulle prestazioni sull'intero sistema non sia troppo grande.

Una volta atime è abilitato, tutto ciò che devi fare è sostituire il -mtime parametro nella riga di comando precedente con -atime .
Potresti essere in grado di rimuovere -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 ricorda di testare il comando usando echo prima di finire per rimuovere cose di cui il tuo sistema ha ancora bisogno!


Non rotolare da solo.

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

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

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

Per quanto riguarda l'ultima parte della tua domanda:

Anche se non penso che esista una modalità di apertura/creazione "delete-this-if-I-die", un processo può tranquillamente eliminare 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 l'ultimo processo che aveva aperto il file uscirà (sia per crash che normalmente), lo spazio occupato dal file verrà liberato.

Per una soluzione generale al problema che a volte alcuni processi non puliscono /tmp, suggerirei di dare un'occhiata agli spazi dei nomi di montaggio, descritti, ad esempio, qui o qui. Se il processo in questione è un demone di sistema, systemd e la sua funzionalità nativa per consentire file system /tmp privati ​​potrebbero essere interessanti.


Linux
  1. Come gestire le capacità dei file Linux

  2. Come trovare un file in Linux

  3. Come creare un file di scambio in Linux

  4. Come svuotare un file di registro in Linux

  5. Come rinominare un file in Linux?

Come collegare simbolicamente un file in Linux

Come proteggere con password una cartella in Linux

Come crittografare file su Linux

Come comprimere la cartella su Linux

Come disabilitare lo scambio in Linux

Come usare gzip in Linux?