data ultima modifica complessiva di un file system ext4

Ciao,

io avrei la necessità di sapere, all'interno di un file system ext4,
qual'e' l'ultima data in cui è stato modificato un file al suo interno.
Non mi serve sapere il file, solo il timestamp di ultima modifica (ma
non di ultima lettura ne' quando è stato montato l'ultima volta).

Attualmente per farlo mi leggo tutti i file e prendo la data di modifica
più grande. funziona, ma è poco efficiente perchè devo scorrermi tutti i
file (parecchi GB). C'e' forse qualche parametro direttamente sul file
system?

Spero di essermi spiegato.

Saluti!

Ciao,

io avrei la necessità di sapere, all'interno di un file system ext4, qual'e' l'ultima data in cui è stato modificato un file al suo interno.
Non mi serve sapere il file, solo il timestamp di ultima modifica (ma non di ultima lettura ne' quando è stato montato l'ultima volta).

Attualmente per farlo mi leggo tutti i file e prendo la data di modifica più grande. funziona, ma è poco efficiente perchè devo scorrermi tutti i file (parecchi GB). C'e' forse qualche parametro direttamente sul file system?

Spero di essermi spiegato.

Saluti!

Occhio croce non c'e` un *singolo* punto dove salva il timestamp di ultima modifica a qualsiasi file.
Se ci fosse, mi sa che sarebbe un bel bottle neck. Almeno cosi` penso da considerazioni teoriche...
qualcuno mi corregga se non e` cosi`.

Invece forse potrebbe darti una man fanotify (7) che e` il cugino di inotify e` almeno dalla man page
sembra riesca a trappare eventi sull'intero filesystem...

Bye,
Chris.

Ciao Chris,

già sembra logico. Poi mi è venuto in mente che c'e' il comando df che
da lo spazio usato in un tempo brevissimo, quindi lo spazio usato
dovrebbe essere scritto in un punto globale o?

Sì, se ricordo bene è il superblock a mantenere il conto dei blocks liberi.
Però afaik nulla riguardo la data di ultimo accesso/modifica.

attachment.htm (1.12 KB)

Se ci fosse, mi sa che sarebbe un bel bottle neck.

Ciao Chris,

già sembra logico. Poi mi è venuto in mente che c'e' il comando df che da lo spazio usato in un tempo brevissimo, quindi lo spazio usato dovrebbe essere scritto in un punto globale o?

In effetti...

Apparentemente df usa statfs() ma se leggi man statfs vedi che
in struct statfs c'e` lo spazio, ma non il timestamp di ultima
modifica.

Bisognerebbe chiedere a qualcuno che conosce meglio l'API del
kernel. Summon THOMAS! Vediamo se funziona lo spell :wink:

Bye,
Chris.

Prova a controllare uno di questi:

https://stackpointer.io/unix/linux-monitor-file-system-changes/397/

ho trovato che "tune2fs -l" riporta la data di ultima scrittura del file
system :slight_smile: (oltre che l'ultimo mount, ecc...)

Solo che non sembra l'ultima modifica di un file ma probabilmente di
"qualsiasi" cosa nel file system.

Provo a disabilitare gli access timestamp sui file per vedere se in
questo modo la data potrebbe corrispondere con le modifiche dei file

Certo che funziona, però non conosco il file system API abbastanza per
poter dare un consiglio utile.
Ho dato un'occhiata al VFS interface, ma non ho visto niente che
potrebbe essere d'aiuto. Il superblock del ext4fs contiene un campo
"s_wtime" (Write time, in seconds since the epoch) però non so se vale
la pena di usare questo campo: è specifico per ext4 e poi potrebbe non
contenere l'informazione cercata: se il file system è stato montato con
le opzioni standard (cioé senza noatime) allora un update del campo
atime è un'operazione di scrittura, dal punto di vista del file system…

Una domanda per Davide, a che cosa ti serve questa informazione? Forse
esiste un'modo alternativo per ottenere la data che cerchi?

Thomas

Ciao,

2018-02-25 15:56 GMT+01:00 Davide <d(a)vide.bz>:

Ciao,

io avrei la necessità di sapere, all'interno di un file system ext4, qual'e'
l'ultima data in cui è stato modificato un file al suo interno.
Non mi serve sapere il file, solo il timestamp di ultima modifica (ma non di
ultima lettura ne' quando è stato montato l'ultima volta).

Senza scomodare le API del kernel come suggerisce Chris, puoi forse
ottenere la stessa informazione usando una combinazione di find
(opzioni -mtime -newer o newerXY) e stat.

Potresti provare una cosa del genere (Standard disclaimer: untested!):
1. trovi un elenco dei file modificati con find (find -t file -mtime 1
# file modificati nelle ultime 24 ore)
2. ottieni l'ultima modifica del contenuto di questo/i file con stat
-c %y (valore di "Modify"),
3. ordini l'output con sort -r e prendi il primo risultato.
4. conservi il nome del file più recente ed alla successiva
invocazione del programma al punto 1 usi find -newer $filename.

Forse non è la soluzione migliore, ma dovrebbe funzionare.
Stefano