File speciale che conserva solo le ultime n righe


0

C'è un modo per creare file speciali sotto Linux che manterrebbero solo, diciamo le ultime 100 righe scritte? Ho un processo di compilazione di un file di registro, e mi piacerebbe analizzare regolarmente le sue 100 ultime righe.

So che potrei usare qualche tipo di logrotate, ma c'è un modo per creare un file speciale che si riempirà fino a raggiungere 100 righe, quindi, aggiungere una riga rimuove quella più vecchia, in modo che il file mantenga solo 100 linee? (una sorta di FIFO line-based)

molte grazie


2
tail fa così, così puoi scrivere un cron job per riempire il file su qualunque intervallo di refresh tu voglia. basta sovrascrivere con tail <file> > <targetfile>. se la frequenza di aggiornamento è sufficientemente alta, si comporta come un buffer FIFO.
Frank Thomas

1
Mentre sarebbe bello avere un file system virtuale personalizzato che puoi cat per ottenere contenuti derivati ​​(come un buffer circolare), questi non sono molto popolari. Sono chiamati file system log-strutturati. Sarebbe perfetto per quello scenario. en.wikipedia.org/wiki/Log-structured_file_system . Per ora, ti suggerisco di scrivere solo uno script che faccia una coda -n 100 a se stesso.
David Betz

Grazie, non ero a conoscenza di tali filesystem! L'ideale sarebbero stati i file speciali che si comportano come tali ring buffer (che eviterebbero di dover installare e montare un'intera FS, e pensavo che le distribuzioni Linux mainstream già lo supportassero). Finirò sicuramente per usare tail, ma sono felice di aver imparato qualcosa :)
Daladim

In generale c'è un modo per creare file che sono proprio come li vuoi: FUSE personalizzato (Filesystem in Userspace). Non è facile come probabilmente speravi, ma è possibile.
Kamil Maciorowski

Risposte:


0

I log sono file di testo (come) ed essendo di questo tipo, l'aggiunta di nuovi blocchi di dischi quando richiesto da nuove linee è un'azione rapida ben supportata da qualsiasi file system.

Tuttavia, abbandonare costantemente la prima riga quando arriva un nuovo significherebbe riorganizzare COSTANTEMENTE almeno alcuni se non tutti i blocchi del file. Ciò significherebbe un grande overhead dedicato alla registrazione, mentre una delle caratteristiche più importanti che vogliamo dal logging è che sia leggero.

I file system non sono preparati per questo (almeno non ho sentito parlare di questo tipo), ecco perché i log loggate / tail / database sono utilizzati dove gli ultimi record sono importanti.


Grazie per questo suggerimento di basso livello a cui non avevo pensato :)
Daladim

0

Supponendo di avere uno script che elabora solo le ultime 100 righe ogni volta che viene eseguito, queste linee vengono catturate al meglio con tail comando, come fa praticamente quello che vuoi fare. La chiave qui è il -n interruttore che stabilisce quante linee deve acquisire, a partire dalla fine.

Puoi incorporare tail -n 100 somefile.log direttamente nel tuo script, oppure puoi eseguire periodicamente tail -n 100 somefile.log > onlylast100lines.log per creare un file con solo le ultime 100 righe. Quest'ultimo approccio riscriverà il file di destinazione ogni volta, quindi non è necessario eliminarlo tra una corsa e l'altra.


Ne ero consapevole tail (e alla fine finirò per usarlo), ma per curiosità, volevo sapere se c'erano funzionalità di Linux che non sapevo che avrebbero fatto il suo lavoro. Grazie comunque.
Daladim

0

Elaborando il metodo Jarmunds, potresti creare uno script bash come questo:

while true; do 
    tail -n 100 somefile.log > onlylast100lines.log
    sleep 5
done

questo dovrebbe analizzare le ultime 100 righe di somefile.log in onlylast100lines.log ogni 5 secondi. Il file verrebbe sovrascritto ogni volta, quindi sarebbero sempre solo le ultime 100 righe. Questo potrebbe essere aggiunto al tuo script di login o al runlevel che vuoi che venga eseguito.


Ne ero consapevole tail (e alla fine finirò per usarlo), ma per curiosità, volevo sapere se c'erano funzionalità di Linux che non sapevo che avrebbero fatto il suo lavoro. Grazie comunque.
Daladim
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.