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

9

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.

    
por mdrozdziel 07.06.2011 / 20:13

2 respostas

12

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.

    
por 07.06.2011 / 20:23
0

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.

    
por 07.06.2011 / 20:31

Tags