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.