Maneira fácil de limitar o tamanho do arquivo (stdout) em um nível de script de shell?

10

Ok, este é um caso de uso muito prático do meu ponto de vista.

Digamos que eu tenha um shell oneliner simples que registre a saída em um arquivo. Isso pode ser simplesmente qualquer coisa, por exemplo, tcpdump. Existe alguma maneira genérica e trivial, para garantir que o arquivo de saída não exceda o tamanho especificado?

A ressonância por trás disso é proteger por engano todo o espaço disponível no ponto de montagem. Se eu esquecer o script, ou ele produzirá GBs de dados por hora, essa tarefa de depuração simples poderá levar a uma possível falha do sistema.

Agora, estou ciente das opções construídas em algumas das ferramentas (como a combinação de -W / -C no tcpdump). O que eu preciso é de um antivírus muito genérico.

Longa história - quando executo um script como:

% this -is --my=very|awsome|script >> /var/tmp/output.log

Como garantir que o output.log nunca fique maior que 1 GB.

Script pode falhar, ser morto ou o que for.

A solução que estou procurando deve ser fácil e simples, usando apenas ferramentas disponíveis em distros populares como o ubuntu / debian / fedora. Em geral, algo amplamente disponível. O programa complicado e multilinha não é uma opção aqui, independentemente do idioma / tecnologia.

mdrozdziel
fonte

Respostas:

16

Você pode usar headpara isso:

command | head -c 1G > /var/tmp/output.log

Ele aceita K, M, G e similares como sufixos (bytes são o padrão). Acrescente 'B' para usar as versões base 10.

Eduardo Ivanec
fonte
cabeça contra parede Não poderia ser mais simples. Obrigado!
Mdrozdziel
2
Parece tail -c 1Gtambém funciona, útil olhar para a cauda de um evento. Compreensivelmente, ele libera após o final do comando.
dashesy
A unidade para sufixos não funciona no Mac OS.
Anumi 22/01/19
0

Defina o tamanho máximo do arquivo para um usuário que será usado apenas para executar esses scripts.

O arquivo /etc/security/limitslimita um usuário com os valores "padrão", a menos que haja valores explícitos para um usuário específico. Esses valores específicos do usuário substituirão os valores padrão. O arquivo pode ter um nome ligeiramente diferente, dependendo do seu sistema operacional.

Se o seu usuário de log tiver o nome log_maker, adicione esta linha ao arquivo:

log_maker hard fsize 1000000

O número após fsize é o tamanho máximo do arquivo em KB.

Chris Ting
fonte
0

O corte reduz o tamanho da saída de um programa e preserva os últimos X KB da saída com o seguinte comando:

run_program | curtail -s 1G myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

NOTA: Sou o mantenedor do repositório acima. Apenas compartilhando a solução ...

Dave Wolaver
fonte
0

Você pode limitar qualquer arquivo com

tail -c 1G myLog.log > myLog.tmp
mv myLog.tmp > myLog.log

Escrever a cauda diretamente no mesmo arquivo cria um arquivo vazio. Então você precisa usar um arquivo temporário.

Séverin
fonte
tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log isso vai matar o log, acho que você queria usar >> em vez de> ou não?
djdomi
O objetivo deste comando é reescrever o log apenas com o último 1G. O >> deve ser para o comando anterior: doSomething >> myLog.log; cauda -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Séverin