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 -not
di 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 123
limitare 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 echo
prima di eliminare effettivamente i file).
Un modo per implementare una soluzione sicura è utilizzare 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 usarlo atime
, ti consiglio 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 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 echo
prima di finire per rimuovere cose di cui il tuo sistema ha ancora bisogno!