Desviar um arquivo de gravação para processar

3

Eu tenho um aplicativo OSX GUI que não posso alterar - ele grava novas linhas CVS em um arquivo de log quando ele conclui um trabalho. Eu gostaria de trabalhar com essas novas linhas, mas elas estão sendo constantemente adicionadas.

Existe uma maneira de redirecionar a saída do aplicativo diretamente para um script no qual eu possa processar as novas linhas conforme elas são geradas? Ler o arquivo a cada X segundos para pegar as alterações não é desejável, e enquanto eu poderia usar launchd para detectar alterações no arquivo e processá-las dessa maneira - estou procurando algo um pouco mais elegante. Qualquer ideia (com exemplos - estou aprendendo) seria muito apreciada.

EDITAR

Não tenho certeza se essa é a melhor abordagem, mas consegui obter resultados instantâneos com o sinalizador -f da cauda. Embora eu possa filtrar a última linha, a primeira vez que ela é executada, quando o arquivo é atualizado, ele exibe todas as linhas e não apenas a última (conforme desejado).

tail -F -n 2 '/path/to/Epson4880_audit.txt' | grep "."
    
por orionrush 21.06.2013 / 22:42

2 respostas

4

Você pode substituir o arquivo de saída por um FIFO e fazer com que seu outro programa receba sua entrada dele.

Por exemplo:

mkfifo Epson4880_audit.txt
# launch your program
grep "." Epson4880_audit.txt

Observe que isso não é garantido para funcionar. Alguns programas verificam se a saída é um arquivo real. E se você quiser manter um registro das linhas, o segundo processo tem que certificar-se de imprimi-las conforme elas chegam. Por exemplo, fazendo tee real_Epson4880_audit.txt | grep "." . Observe também que você não poderá iniciar seu primeiro programa sem o segundo porque o primeiro processo será forçado a esperar por um leitor. No caso de você querer rodar o primeiro programa sem o segundo, você terá que remover o FIFO primeiro.

    
por 21.06.2013 / 23:04
2

A maioria dos sistemas operacionais tem um recurso onde você pode se inscrever para a atividade em um arquivo. No Linux este recurso é construído no kernel e é chamado iNotify. Você poderia criar algo ao longo dessas linhas para assistir à atividade do arquivo e depois lidar com essas atualizações.

Aqui estão alguns recursos para você começar a entender o iNotify:

Mesmo que essas páginas mostrem código C / C ++, você não precisa desenvolver suas próprias ferramentas para interagir com ele. Existem ferramentas de linha de comando que você pode usar para assinar um arquivo e / ou diretório e receber notificações.

NOTA: No OSX, você usará algo semelhante chamado kqueue . Eu encontrei este tópico que discute muitas das opções no Stack Overflow, intitulado: Existe um comando como" watch "ou" inotifywait "no Mac? .

Existem ferramentas que oferecem recursos semelhantes a inotifywait no OSX, como launchd , kqwait , fswatch ou watchdog .

A outra abordagem que você pode fazer é observar como as ferramentas de monitoramento, como o Nagios, monitoram os arquivos de log quanto à atividade. Existe uma grande quantidade de plugins para o Nagios que fazem exatamente o que você está tentando fazer. Alguns deles monitoram um arquivo apenas por atividade enquanto outros monitoram os arquivos para cadeias específicas. Dê uma olhada na página de plugins.

Plugins do Nagios - Categoria: Arquivos de Log

    
por 21.06.2013 / 23:08