Eu tenho um log do servidor que gera uma linha específica de texto em seu arquivo de log quando o servidor está ativo. Quero executar um comando quando o servidor estiver ativo e, portanto, faça algo como o seguinte:
tail -f /path/to/serverLog | grep "server is up" ...(now, e.g., wget on server)?
Qual é a melhor maneira de fazer isso?
text-processing
shell-script
logs
tail
jonderry
fonte
fonte
tail -F
a rotação de log punho - ou seja,my.log
torna-se completa e se move paramy.log.1
e seu processo cria um novomy.log
Respostas:
Uma maneira simples seria estranha.
E sim, ambas são mensagens reais de um log do kernel. Perl pode ser um pouco mais elegante de usar e também pode substituir a necessidade de cauda. Se estiver usando perl, será algo parecido com isto:
fonte
awk
solução por ser curta e fácil de fazer em tempo real em uma linha. No entanto, se o comando que eu quero executar possui aspas, isso pode ser um pouco complicado, existe uma alternativa, talvez usando pipelines e comandos compostos que também permitam uma solução rápida de uma linha, mas não exijam que o comando resultante seja passado como uma corda?system()
comando.tail -f /path/to/serverLog | grep "server is up" | head -1 && do_some_command
tail -n 0 -f /path/to/serverLog
Que lê as últimas 0 linhas do arquivo e aguarda a impressão de mais linhas.Se você está procurando apenas uma possibilidade e deseja permanecer principalmente no shell, em vez de usar
awk
ouperl
, pode fazer algo como:... que será executado
my_command
sempre que "o servidor estiver ativo " aparecer no arquivo de log. Para várias possibilidades, talvez você possa largar ogrep
e, em vez disso, usar umcase
dentro dowhile
.A capital
-F
diztail
para observar o arquivo de log ser girado; ou seja, se o arquivo atual for renomeado e outro arquivo com o mesmo nome substituir, eletail
passará para o novo arquivo.A
--line-buffered
opção dizgrep
para liberar seu buffer após cada linha; caso contrário,my_command
poderá não ser alcançado em tempo hábil (assumindo que os logs tenham linhas de tamanho razoável).fonte
--line-buffered
opçãogrep
ou garantir que ela libere sua saída entre linhas: caso contrário, ela simplesmente trava emy_command
nunca é alcançada. Se você preferirack
, tem uma--flush
bandeira; se preferirag
, tente encerrar comstdbuf
. stackoverflow.com/questions/28982518/…do exit ;
. Pareceu funcionar bem, mas a cauda nunca terminou e nosso script nunca passou para a próxima linha. Existe uma maneira de parar a cauda nado
seção?Esta pergunta parece já ter sido respondida, mas acho que há uma solução melhor.
Em vez disso
tail | whatever
, acho que você realmente querswatch
. O Swatch é um programa projetado explicitamente para fazer o que você está pedindo, assistindo a um arquivo de log e executando ações com base nas linhas de log. O usotail|foo
exigirá que você tenha um terminal em execução ativamente para fazer isso. Por outro lado, a amostra é executada como um daemon e sempre estará observando seus registros. O Swatch está disponível em todas as distribuições Linux,Encorajo-vos a experimentar. Embora você possa pregar um prego na parte traseira de uma chave de fenda, isso não significa que você deva.
O melhor tutorial de 30 segundos sobre amostras que pude encontrar está aqui: http://www.campin.net/newlogcheck.html
fonte
É estranho que ninguém tenha mencionado sobre o
multitail
utilitário que possui essa funcionalidade pronta para uso. Um exemplo de uso:Veja também outros exemplos de
multitail
uso.fonte
bash poderia fazer o trabalho sozinho
Vamos ver como pode ser simples e legível:
Enquanto você não usa o bash
regex
, isso pode ficar muito rápido!Mas o bash + sed é um conjunto muito eficiente e interessante
Mas, para servidores de alta carga, e como eu gosto,
sed
porque é muito rápido e muito escalável, costumo usar isso:fonte
Foi assim que eu comecei a fazer isso também, mas ficou muito mais sofisticado com isso. Algumas coisas para se preocupar:
Eu uso algo na mesma linha:
Funciona mantendo
tail
aberto até que o${RELEASE}
arquivo contenha dados.Depois que o
grep
conseguir:${RELEASE}
qual será${wait_pid}
processo paratail
Nota:
sed
Pode ser mais sofisticado para determinar realmente o número de linhas quetail
serão produzidas na inicialização e remover esse número. Mas geralmente são 10.fonte