Script di shell Unix per troncare un file di grandi dimensioni


87

Sto cercando di scrivere uno script Unix che troncerà / svuoterà un file che viene continuamente scritto / aperto da un'applicazione quando raggiunge, ad esempio, 3 GB di spazio. So che il comando seguente lo farebbe:

cp /dev/null [filename]

Ma lo eseguirò automaticamente in un ambiente di produzione come cron job, postando qui solo per vedere se avete riscontrato problemi mentre facevate qualcosa di simile a questo.


Questi sono prod. i log non hanno valore? Ho avuto la fortuna di mantenere i miei registri di produzione per un anno + (in bzip2 -9 fmt) e avevo alcune piccole utilità che rendevano facile estrarre i tempi di lavoro, i record elaborati e quando venivano caricati in un foglio di calcolo era facile calcolare e rappresentare graficamente i rapporti di caricamento e un sacco di cose. Abbiamo scoperto un problema di hdwr a causa della diminuzione dei rapporti di carico. Sì, ci sono strumenti di monitoraggio adorabili là fuori, quindi tutto dipende dalla tua situazione. COME OPZIONE SEPARATA, hai guardato logrotate, potrebbe fornirti un certo valore (ma essere fastidioso con l'impostazione (solo indovinare)!).
bombardamento

5
Si noti che se il file di registro viene aperto con il flag O_APPEND, il troncamento è effettivo. Se non viene aperto con il flag O_APPEND, il programma continuerà a scrivere con offset 3 GiB (la prima volta); il sistema tratterà i primi 3 GiB come zero byte (che si comprime bene), ma il file continuerà a crescere. Tutto dipende dal programma che scrive il registro.
Jonathan Leffler

Risposte:


116

Solo per aggiungere un'altra risposta,

: > filename

: è un no-op in bash (conforme a POSIX), quindi questo essenzialmente apre solo il file per la scrittura (che ovviamente tronca il file) e poi lo chiude immediatamente.

EDIT: come ha commentato Shellter, non hai effettivamente bisogno di un comando per andare avanti con il reindirizzamento:

$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$

Un semplice reindirizzamento tutto da solo cancellerà il file.


25
o semplicemente > filename(come sono sicuro che tu sappia). Buona fortuna a tutti.
bombardamento

5
@shelter "$> file" non POSIX e non portabile. Dovresti usare il comando ":" no-op prima di reindirizzare, come inizialmente suggerito.
Aaron Toponce

2
+ plus per la faccina sorridente
Chris Suszyński

2
Come ha sottolineato @AaronToponce, "$> file" non è davvero portabile; sulla mia configurazione Zsh fa bloccare la shell (presumibilmente in attesa di input). "$:> file" funziona perfettamente in Zsh.
Linus Arver

1
@TechEnthusiast Dipende dalle tue aspettative. Il troncamento stesso è atomico, ma non sai davvero quando accadrà rispetto a una particolare scrittura. Ad esempio, potresti finire con una riga parziale all'inizio del file.
chepner

66

Ho usato il seguente comando su Debian

truncate -s 0 filename

@SteveClay: sudo sh -c ': > filename'verrà anche troncatofilename
Perleone

2
@SteveClay Il suggerimento PO funziona anche perfettamente con sudo: sudo cp /dev/null filename. Inoltre cpè portatile mentre truncateè solo Linux moderno.
Tino

11

Mi sembra ragionevole. Unix, ovviamente, ti permetterebbe di farlo in circa 50 modi diversi. Per esempio,

echo -n "" >filename
cat /dev/null >filename

2

trunc filename

funziona sulla versione AIX di UNIX

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.