Respostas:
tente isto:
truncate -s 0 /var/log/*log
EDITAR:
se você quiser fazer isso mais de uma vez, use logrotate
para manipular seus logs. Geralmente é instalado no ubuntu. Veja man logrotate
(ou, se não o tiver instalado, consulte a página de manual online ou instale-a comsudo apt-get install logrotate
)
da página de manual:
O logrotate foi desenvolvido para facilitar a administração de sistemas que geram um grande número de arquivos de log. Permite rotação automática, compactação, remoção e envio de arquivos de log. Cada arquivo de log pode ser tratado diariamente, semanalmente, mensalmente ou quando cresce muito.
Se você deseja limpar todos os seus arquivos de log, não apenas aqueles na pasta de log de primeiro nível, você pode usar:
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
Observando que, se você já estiver logrotate
executando, precisará limpar também os .gz
logs girados :
find /var/log -type f -name '*.[0-99].gz' -exec rm {} +
Um uso válido para isso pode estar criando um contêiner de dispositivo VM para distribuição, por exemplo.
Você não precisa fazer isso como parte da manutenção de rotina: como o DEM sugeriu corretamente, use logrotate
para isso.
Como acompanhamento de @DEN resposta
Isso localizará todos os arquivos de log /var/log
e os truncará para 0 bytes.
find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
*.log*
vez disso, eu usaria, mas não tenho certeza se é 100% seguro, por isso não o incluí na resposta. Porque existem arquivos como dovecot.log-20180930
e dovecot.log-20180923.gz
.
Existem alguns métodos para truncar completamente um arquivo, geralmente aplicável à maioria dos sistemas operacionais compatíveis com POSIX. O mais comum que você verá com scripts de shell é algo como true > file.txt
ou : > file.txt
(e, no caso de bash
shell, o >
redirecionamento é suficiente). Isso se deve à maneira como >
abre arquivos via open()
ou openat()
syscall com O_WRONLY|O_CREAT|O_TRUNC
sinalizadores - que lê somente gravação OU cria se o nome do arquivo não existir, OU truncará o nome do arquivo existente.
Com isso em mente, podemos implementar algo parecido em C:
#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;
}
Nomeie o arquivo que armazena esse código trunc.c
e compile-o gcc trunc.c -o trunc
e você terá um pequeno utilitário que truncará um argumento de nome de arquivo fornecido como em trunc ./foobar.txt
. Obviamente, esse código não faz outras verificações, apenas trunca o primeiro parâmetro posicional. Vou deixar para os leitores descobrir como lidar com mais de um parâmetro posicional. Na nota lateral, há truncate()
syscall que também poderíamos usar e truncar um arquivo com tamanho variável.
Agora, se você não é fã de C, o Python pode ser mais fácil para você. open()
O comando opera com o mesmo princípio no Python - abrindo arquivo para escrever e truncar se o nome do arquivo existir. Assim nós podemos fazer
python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy
Quanto à localização de todos os .log
arquivos, isso já foi abordado em outras respostas - use *
glob ou glob estendido bash
. Há também find -type f -name "*.log"
, que tem -exec
bandeira para a execução de comandos (neste caso em particular sh -c ''
para aproveitar >
porque >
é um operador de shell e não um executável externo). Assim você pode fazer
find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;
Também é importante notar que os arquivos de log no diretório, como /var/log
muitas vezes são rodados pelo serviço logrotate, então haverá nomes de arquivos tais como /var/log/service.log
, /var/log/service.log.1
, etc, para que você pode querer usar *.log.[1-9]
padrão em vez
Entre outras coisas, podemos copiar /dev/null
para o arquivo desejado. Por incrível que pareça, embora /dev/null
seja um tipo de arquivo de dispositivo de caractere especial, quando você copia isso em outro lugar, o resultado é um arquivo normal vazio, pelo menos com o GNU cp
. Assim nós podemos fazer
cp /dev/null foo.txt
ou
dd if=/dev/null of=foo.txt
Outra leitura sugerida:
É uma boa prática girar os logs em / var / logs para girar com a funcionalidade de rotação de logs, mas não sempre que desejamos. Os logs do sistema serão impressos nela e serão úteis para depurar qualquer falha.
Se for um requisito não usar o logrotate, as opções poderão ser exploradas. Embora truncar seja uma opção fácil em alguns tipos de sistema unix, esse comando não está disponível prontamente, precisa ser instalado. Se não for permitido instalar o novo comando, o loop abaixo pode ser usado.
for logfile $(ls /path/*.log)
do
cat /dev/null > $logfile
done
for logfile in /path/*.log
vez disso.
/var/log
é onde o sistema coloca as mensagens que você pode precisar mais tarde. O Ubuntu já encontrou o problema antes. Leiaman 8 logrotate;man logrotate.conf
.