Como posso limitar o tamanho de um arquivo de log gravado com >>
200 MB?
$ run_program >> myprogram.log
io-redirection
limit
size
david
fonte
fonte
Respostas:
Se o seu aplicativo (ou seja,
run_program
) não suportar a limitação do tamanho do arquivo de log, você poderá verificar o tamanho do arquivo periodicamente em um loop com um aplicativo ou script externo.Você também pode usar
logrotate(8)
para girar seus logs, ele possui umsize
parâmetro que você pode usar para sua finalidade:fonte
postscript
opção para fazer com que a configuração do logrotate seja enviadaSIGHUP
ao programa.Se o seu programa não precisar gravar OUTROS arquivos maiores que esse limite, você poderá informar o kernel desse limite usando
ulimit
. Antes de executar seu comando, execute isso para configurar um limite de tamanho de arquivo de 200 MB para todo o processo executado na sua sessão atual do shell:Isso protegerá o seu sistema, mas pode estar causando problemas para o programa que está gravando o arquivo. Como eyazici sugere , considere configurar
logrotate
para remover arquivos de log assim que atingirem um determinado tamanho ou idade. Você pode descartar dados antigos ou arquivá-los por um período de tempo em uma série de arquivos compactados.fonte
Você pode criar uma nova imagem do sistema de arquivos, montá-la usando o dispositivo de loop e colocar o arquivo de log nesse sistema de arquivos:
Você também pode usar em
tmpfs
vez de um arquivo, se tiver memória suficiente.fonte
Você pode truncar a saída com
head
:fonte
SIGPIPE
) assim que atingir o limite de tamanho, em vez de descartar os dados.dd
mágica, mas sim, a Random832 está certa, você receberá umSIGPIPE
ashead
/dd
/whatever
drops.trap '' SIGPIPE
?{ head -c "$size" >> log; cat > /dev/null; }
.No pacote
apache2-utils
está presente o utilitário chamadorotatelogs
, pode ser útil para você.Sinopse:
rotatelogs [-l] [-L linkname ] [-p program ] [-f] [-t] [-v] [-e] [-c] [-n número de arquivos ] tempo de rotação do arquivo de log | tamanho do arquivo (B | K | M | G) [ deslocamento ]
Exemplo:
Manual completo que você pode ler neste link .
fonte
Estou certo de que o pôster original encontrou uma solução. Aqui está outro para outros que podem ler este tópico ...
O corte reduz o tamanho da saída de um programa e preserva os últimos 200 MB de saída com o seguinte comando:
Referências
NOTA: Sou o mantenedor do repositório acima. Apenas compartilhando a solução ...
fonte
Como é um texto, eu escreveria um script no seu idioma favorito e o direcionaria para isso. Faça com que ele lide com a E / S do arquivo (ou mantenha tudo na memória e depois despeje-o
SIGHUP
ou similar). Por isso, em vez de 200 MB, eu pensaria em um número 'razoável' de linhas para acompanhar.fonte
syslog
elogrotate
.O script a seguir deve fazer o trabalho.
Ele tem alguns atalhos óbvios, mas no geral ele faz o que você pediu. Ele dividirá o log em pedaços de tamanho limitado e a quantidade de pedaços também é limitada. Tudo pode ser especificado através dos argumentos da linha de comando. O arquivo de log também é especificado através da linha de comando.
Observe uma pequena pegadinha se você a usar com o daemon que se bifurca em segundo plano. O uso de um pipe impedirá que o daemon vá para o segundo plano. Nesse caso, há uma sintaxe (provavelmente específica do bash) para evitar o problema:
Observe que
<&0
, embora pareça redundante, não funcionará sem isso.fonte