Risposte:
prova questo:
truncate -s 0 /var/log/*log
MODIFICARE:
se vuoi farlo più di una volta dovresti usare logrotate
per gestire i tuoi log. Di solito è installato in Ubuntu. Dai un'occhiata man logrotate
(o se non lo hai installato guarda la manpage online o installalo con sudo apt-get install logrotate
)
dalla manpage:
logrotate è progettato per facilitare l'amministrazione di sistemi che generano un numero elevato di file di registro. Consente la rotazione, la compressione, la rimozione e l'invio automatici dei file di registro. Ogni file di registro può essere gestito giornalmente, settimanalmente, mensilmente o quando diventa troppo grande.
Se si desidera cancellare tutti i file di registro, non solo quelli nella cartella di registro di primo livello, è possibile utilizzare:
shopt -s globstar # if needed
truncate -s 0 /var/log/*.log # first-level logs
truncate -s 0 /var/log/**/*.log # nested folders, like /var/log/nginx/access.log
Notando che se hai già in logrotate
esecuzione, dovrai cancellare anche i .gz
registri ruotati :
find /var/log -type f -name '*.[0-99].gz' -exec rm {} +
Un uso valido per questo potrebbe essere la creazione di un contenitore di appliance VM per la distribuzione, ad esempio.
Non dovresti aver bisogno di farlo come parte della manutenzione ordinaria: come DEM ha suggerito correttamente, usalo logrotate
per quello.
Come seguito alla risposta @DEN
Questo troverà tutti i file di registro /var/log
e li troncerà a 0 byte.
find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
*.log*
invece utilizzare, ma non sono sicuro che sia sicuro al 100%, quindi non l'ho incluso nella risposta. Perché ci sono file come dovecot.log-20180930
e dovecot.log-20180923.gz
.
Esistono due metodi per troncare completamente un file, generalmente applicabile alla maggior parte dei sistemi operativi compatibili con POSIX. Il più comune che vedrai con gli script di shell è qualcosa di simile true > file.txt
o : > file.txt
(e in caso di bash
shell, il >
reindirizzamento da solo è sufficiente). Ciò è dovuto al modo in cui >
apre i file tramite open()
o openat()
syscall con O_WRONLY|O_CREAT|O_TRUNC
flag - che legge la sola scrittura o crea se il nome file non esiste, o tronca il nome file esistente.
Con questo in mente, possiamo implementare qualcosa del genere in C noi stessi:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv){
if (argc == 2){
int fd = open(argv[1],O_TRUNC);
close(fd);
}
return 0;
}
Denominare il file in cui è memorizzato questo codice trunc.c
e compilarlo con gcc trunc.c -o trunc
, e si avrà una piccola utility che troncerà un argomento del nome file fornito come in trunc ./foobar.txt
. Naturalmente, questo codice non esegue altri controlli, ma tronca solo il primo parametro posizionale. Lascerò ai lettori capire come gestire più di un parametro posizionale. Sulla nota a truncate()
margine , c'è anche syscall che potremmo usare e troncare un file a lunghezza variabile.
Ora, se non sei un fan di C, Python potrebbe essere più facile per te. open()
Il comando opera sullo stesso principio in Python: apertura del file per la scrittura e il troncamento se esiste un nome file. Così possiamo fare
python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy
Per quanto riguarda la ricerca di tutti i .log
file, è già stato trattato in altre risposte - usa *
glob o extended glob in bash
. C'è anche find -type f -name "*.log"
, che ha -exec
flag per l'esecuzione di comandi (in questo caso particolare sh -c ''
da sfruttare >
perché >
è un operatore shell e non un eseguibile esterno). Così puoi fare
find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;
E 'anche interessante notare che i file di log nella directory come /var/log
spesso vengono fatti ruotare dal servizio logrotate, quindi ci saranno nomi di file come ad esempio /var/log/service.log
, /var/log/service.log.1
, ecc, quindi si consiglia di utilizzare *.log.[1-9]
motivo invece
Tra le altre cose, possiamo copiare /dev/null
nel file desiderato. Stranamente, anche se /dev/null
è un tipo di file con dispositivo a caratteri speciali, quando lo copi altrove il risultato è un file normale vuoto, almeno con GNU cp
. Così possiamo fare
cp /dev/null foo.txt
o
dd if=/dev/null of=foo.txt
Altre letture consigliate:
È buona norma ruotare i log in / var / logs per ruotare con la funzionalità logrotate ma non ogni volta che lo desideriamo. I log di sistema verranno stampati e saranno utili per eseguire il debug di eventuali errori.
Se è necessario non utilizzare logrotate, è possibile esplorare le opzioni. Sebbene troncare sia un'opzione semplice in alcune versioni del sistema unix, questo comando non è disponibile prontamente, deve essere installato. Se non è consentito installare il nuovo comando, è possibile utilizzare il ciclo sottostante.
for logfile $(ls /path/*.log)
do
cat /dev/null > $logfile
done
for logfile in /path/*.log
invece.
/var/log
è dove il sistema inserisce i messaggi che potrebbero essere necessari in seguito. Ubuntu ha riscontrato il problema in precedenza. Leggiman 8 logrotate;man logrotate.conf
.