Você pode usar head
para isso:
command | head -c 1G > /var/tmp/output.log
Ele aceita K, M, G e similares como sufixos (bytes são o padrão). Anexe 'B' para usar as versões base 10.
Ok, este é um caso de uso muito prático do meu ponto de vista.
Digamos que eu tenha um oneliner de shell simples que registra 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 dado?
Resoning atrás disso, é proteger de preencher todo o espaço disponível no ponto de montagem por engano. Se eu esquecer o script, ou se ele gerar GB de dados por hora, essa tarefa de depuração simples poderá levar a uma possível falha no sistema.
Agora, estou ciente das opções criadas em algumas das ferramentas (como a combinação de -W / -C no tcpdump). O que eu preciso é de um failafe muito genérico.
Longa história curta - quando eu executo um script como:
% this -is --my=very|awsome|script >> /var/tmp/output.log
Como se certificar de que o output.log nunca será maior que 1GB.
O 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. Programa de múltiplas linhas complicado não é uma opção aqui, independentemente da linguagem / tecnologia.
Defina o tamanho máximo do arquivo para um usuário que será usado apenas para executar esses scripts.
O arquivo /etc/security/limits
limita um usuário aos valores de "padrão", a menos que haja valores explícitos para um usuário específico. Esses valores específicos do usuário sobrescreverã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 é chamado de 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.
Tags bash