Limitar stdout de um processo em execução contínua

3

Eu não tive muita sorte em encontrar uma resposta para o meu problema, mas talvez eu não esteja pedindo isso corretamente.

Eu tenho um processo inicializado como o seguinte:

nohup ping 127.0.0.1 > log.txt >2>&1 &

Comando muito simples, envie toda a stdout para log.txt. O único problema é que o comando que estou executando envia dados a cada enésimo segundo para log.txt. Eu gostaria de produzir apenas uma linha para o meu arquivo log.txt em vez de anexá-lo e correr o risco de preencher minha unidade.

Existe uma maneira de produzir apenas uma linha para log.txt que é continuamente sobrescrita?

    
por eproms 13.11.2012 / 17:35

2 respostas

6

Aqui está uma solução rápida e suja para manter apenas a última linha de saída no arquivo de log:

ping localhost | 
  while IFS= read -r line; do 
    printf '%s\n' "$line" > log.txt; 
  done

Tenha em atenção que agora você provavelmente tem todos os tipos de condições de corrida ao tentar acessar o arquivo para leitura. "Bloquear" o arquivo do acesso mútuo pode ajudar. Para obter mais informações sobre como bloquear essa pergunta no stackoverflow, pode ser um bom começo: Como faço para sincronizar (bloquear / desbloquear) o acesso a um arquivo no bash de vários scripts?

    
por 13.11.2012 / 18:03
0

Experimente este script, funciona para mim:

% nohup ping 127.0.0.1 > log.txt >&1&

Verifique se o processo está sendo executado digitando:

% ps ax | grep ping

Se o processo estiver em execução:

% tail -f log.txt

Se continuar pingando, seu script está funcionando corretamente.

    
por 08.04.2013 / 03:48