Al hacer una tail -f error.log
, ¿cómo insertar programáticamente un salto de línea después de que no se haya agregado nada al archivo durante 3 segundos?
(obviamente, una vez que se ha agregado un salto de línea, no se debe agregar ningún otro salto de línea hasta que se agreguen otras líneas de texto al archivo de registro)
Por ejemplo, estas líneas se agregan a error.log:
foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far
Este sería el resultado en la consola:
foo
bar
boo
2far
2foo
2bar
2boo
2far
shell-script
text-processing
tail
Cedric
fuente
fuente
ts
para agregar marcas de tiempo a la salida y procesar las marcas de tiempoRespuestas:
Siempre puede implementar el
tail -f
(bueno aquí, a menos que descomente elseek()
, más comotail -n +1 -f
cuando estamos volcando todo el archivo) a mano con,perl
por ejemplo:O deje
tail -f
que se sigan y utiliceperl
para insertar las nuevas líneas si no hay entrada durante 3 segundos:Aquellos suponen que la salida en sí no se ralentiza (como cuando la salida va a una tubería que no se lee activamente).
fuente
bash
+date
solución:fuente
$SECONDS
para contar intervalos de tiempo. Creo que es la cantidad de segundos desde que se inició el shell, no es importante cuando se toma la diferencia.read -t
o$TMOUT
.$SECONDS
está rotobash
ymksh
.time bash -c 'while ((SECONDS < 3)); do :; done'
durará entre 2 y 3 segundos. Mejor usar zsh o ksh93 en su lugar aquí (contypeset -F SECONDS
)date +%s
. Ambos dan el tiempo en segundos completos, lo que tiene el efecto de que el intervalo de, por ejemplo, 1.9 a 4.0 parece 3 segundos completos, aunque en realidad es 2.1. Es difícil evitar eso si no puedes acceder a los segundos fraccionarios. Pero sí, probablemente deberían dormir aquí en lugar de estar ocupados, y luegoread -t
podrían ser utilizados. Incluso si duermes manualmente,time bash -c 'while [[ $SECONDS -lt 3 ]]; do sleep 1; done'
funciona bien.SECONDS=0
asegura que$SECONDS
alcanzará 1 en exactamente 1 segundo. Ese no es el caso,bash
ya que utilizatime()
para rastrear en$SECONDS
lugar degettimeofday()
. Informé de errores a mksh, zsh y bash hace algún tiempo, solo se solucionó zsh. (Buen punto sobre que el problema es el mismo condate +%s
). Tenga en cuenta que no es un loop ocupado aquí, ya que estamos leyendo de la salida detail -f
más de una tubería.printf
emulardate
sin necesidad de herramientas externas o sustitución de comandos:printf -v t '%(%s)T' -1
.Python
solución (con argumento dinámico de intervalo de tiempo ):tailing_by_time.py
guión:Uso:
fuente