Ao fazer um tail -f error.log
, como inserir programaticamente uma quebra de linha depois que nada foi anexado ao arquivo por 3 segundos?
(obviamente, depois que uma quebra de linha foi adicionada, nenhuma outra quebra de linha deve ser adicionada até que outras linhas de texto sejam adicionadas ao arquivo de log)
Por exemplo, essas linhas são associadas ao error.log:
foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far
Essa seria a saída no console:
foo
bar
boo
2far
2foo
2bar
2boo
2far
shell-script
text-processing
tail
Cedric
fonte
fonte
ts
para adicionar timestamping para a saída e processar os timestampsRespostas:
Você sempre pode implementar o
tail -f
(bem aqui, a menos que descomente oseek()
, mais comotail -n +1 -f
estamos lançando o arquivo inteiro) manualmente,perl
por exemplo:Ou deixe
tail -f
o tailing e useperl
para inserir as novas linhas se não houver entrada por 3 segundos:Eles assumem que a saída em si não é mais lenta (como quando a saída vai para um canal que não é lido ativamente).
fonte
bash
+date
solução:fonte
$SECONDS
para contar intervalos de tempo. Eu acho que é o número de segundos desde que o shell foi iniciado, não que isso importe ao fazer a diferença.read -t
ou$TMOUT
.$SECONDS
está quebradobash
emksh
.time bash -c 'while ((SECONDS < 3)); do :; done'
durará entre 2 e 3 segundos. Melhor usar zsh ou ksh93 vez aqui (comtypeset -F SECONDS
)date +%s
. Ambos fornecem o tempo em segundos completos, o que faz com que o intervalo de, digamos, 1,9 a 4,0 pareça 3 segundos completos, mesmo que seja realmente 2,1. É difícil contornar isso, se tudo o que você não consegue acessar são os segundos fracionários. Mas sim, eles provavelmente deveriam dormir aqui em vez de busylooping, e entãoread -t
poderiam muito bem ser usados. Mesmo se você dorme manualmente,time bash -c 'while [[ $SECONDS -lt 3 ]]; do sleep 1; done'
funciona muito bem.SECONDS=0
garante que$SECONDS
atingirá 1 em exatamente 1 segundo. Esse não é o caso,bash
pois ele usatime()
para rastrear em$SECONDS
vez degettimeofday()
. Relatei bugs para mksh, zsh e bash há algum tempo, apenas o zsh foi corrigido. (ponto positivo sobre o problema ser o mesmodate +%s
). Observe que não é um busyloop aqui, como estamos lendo a partir da saída detail -f
mais de um tubo.printf
para emulardate
sem ferramentas externas ou substituição de comando:printf -v t '%(%s)T' -1
.Python
solução (com argumento de intervalo de tempo dinâmico ):tailing_by_time.py
roteiro:Uso:
fonte