Un modo semplice per limitare la dimensione del file (stdout) a livello di script shell?


10

Ok, questo è un caso d'uso molto pratico dal mio punto di vista.

Supponiamo che io abbia un semplice oneliner di shell che registra l'output in un file. Questo può essere semplicemente qualsiasi cosa, ad esempio tcpdump. Esiste un modo generico e banale, per essere sicuri, che il file di output non superi le dimensioni indicate?

Risuonare dietro questo, è proteggere dal riempimento dell'intero spazio disponibile sul punto di montaggio per errore. Se dimentico lo script, o produrrà GB di dati all'ora, questa semplice attività di debug può portare a un potenziale arresto anomalo del sistema.

Ora sono a conoscenza delle opzioni integrate in alcuni strumenti (come la combinazione di -W / -C in tcpdump). Quello di cui ho bisogno è un fail-safe molto generico.

Per farla breve: quando eseguo una sceneggiatura come:

% this -is --my=very|awsome|script >> /var/tmp/output.log

Come assicurarsi che output.log non diventerà mai più grande di 1 GB.

Lo script può andare in crash, essere ucciso o altro.

La soluzione che sto cercando dovrebbe essere facile e semplice, usando solo gli strumenti disponibili nelle distribuzioni popolari come Ubuntu / Debian / Fedora. In generale qualcosa di ampiamente disponibile. Il programma multilinea complicato non è un'opzione qui indipendentemente dal linguaggio / dalla tecnologia.

Risposte:


16

Puoi usare headper questo:

command | head -c 1G > /var/tmp/output.log

Accetta K, M, G e simili come suffissi (i byte sono l'impostazione predefinita). Aggiungi 'B' per usare le versioni base 10.


head agains wall Non potrebbe essere più semplice. Grazie!
mdrozdziel,

2
Sembra tail -c 1Ganche funzionare, utile per guardare la coda di un evento. Comprensibilmente arrossisce dopo la fine del comando.
dashesy,

L'unità per i suffissi non funziona su Mac OS.
anumi,

0

Impostare la dimensione massima del file per un utente che verrà utilizzato solo per eseguire questi script.

Il file /etc/security/limitslimita un utente con i valori di "default" a meno che non ci siano valori espliciti per un utente specifico. Questi valori specifici dell'utente sovrascriveranno i valori predefiniti. Il file potrebbe avere un nome leggermente diverso a seconda del sistema operativo in uso.

Se l'utente del registro si chiama log_maker, quindi aggiungere questa riga al file:

log_maker hard fsize 1000000

Il numero dopo fsize è la dimensione massima del file in KB.



0

Puoi limitare qualsiasi file con

tail -c 1G myLog.log > myLog.tmp
mv myLog.tmp > myLog.log

Scrivere la coda direttamente nello stesso file rende un file vuoto. Quindi è necessario utilizzare un file temporaneo.


tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log questo ucciderà il registro, penso che tu volessi usare >> invece di> o no?
djdomi,

Lo scopo di questo comando è di riscrivere il registro con solo l'ultimo 1G. Il >> dovrebbe essere per il comando precedente: doSomething >> myLog.log; tail -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Séverin,
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.