2012-11-27 2 views
64

Sto provando a scrivere uno script Unix che troncherà/svuoterà un file che viene continuamente scritto/aperto da un'applicazione quando raggiunge 3 GB di spazio. So che il comando sotto lo farebbe:Script di shell Unix per troncare un file grande

cp /dev/null [filename] 

Ma ho intenzione di eseguire questo in un ambiente di produzione automaticamente come un job cron - solo distacco qui per vedere se voi ragazzi che devono affrontare eventuali problemi mentre si fa qualcosa di simile a Questo.

+0

Questi sono prod. i registri non hanno valore? Ho avuto la fortuna di conservare i registri di produzione per un anno + (in bzip2 -9 fmt) e ho avuto alcune piccole utility che hanno semplificato l'estrazione dei runtime dei processi, i record elaborati e quando è stato caricato in un foglio di calcolo è stato facile calcolare e calcolare i rapporti di caricamento e un sacco di cose. Abbiamo scoperto un problema di hdwr a causa del calo dei rapporti di carico. Sì, ci sono strumenti di monitoraggio adorabili là fuori, quindi tutto dipende dalla tua situazione. COME OPZIONE SEPARATA, hai guardato su 'logrotate', potrebbe darti qualche valore (ma essere noioso con l'impostazione (solo a indovinare)!). – shellter

+5

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

+0

Possibile duplicato di [Come svuotare ("troncare") un file su linux che esiste già ed è protetto in qualche modo?] (Http://stackoverflow.com/questions/2423281/how-to-empty-truncate-a- file-on-linux-che-già-esiste-e-è-protetto-i) –

risposta

9

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

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

La modifica recente da usare 'echo -n' risolve il problema. Le modifiche al codice @JackDouglas di solito non sono raccomandate su StackOverflow. – tripleee

+0

@ triplo che non è la mia lettura di [questo meta post] (http://meta.stackoverflow.com/a/260246/533832) - hai un altro da indicarmi? –

+0

Non lontano dalla mia testa, no. Diversi commenti in questo post sono negativi verso le modifiche al codice in generale, ma forse c'è un cambiamento in corso. Il mio quib principale qui era che il commento di upvoted non aveva più senso e/o confondeva i nuovi visitatori. – tripleee

85

solo per aggiungere un'altra risposta,

: > filename 

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

EDIT: come Shellter commentato, in realtà non hanno 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 da sola sarà cancellare il file.

+17

o semplicemente '> nomefile' (come sono sicuro che tu sappia). Buona fortuna a tutti. – shellter

+0

@shellter fa una risposta. – antik

+0

Cool, mi piace questa risposta. –

51

Ho usato il seguente comando su debian

truncate -s 0 filename 
+0

Funziona anche su Centos 6. –

+3

L'unica risposta che ha funzionato con 'sudo' –

+0

@SteveClay:' sudo sh -c ':> nomefile'' troncerà anche 'nomefile' – Perleone

1

trunc filename

lavori sul sapore AIX di UNIX