tuberias salida redireccionar redireccionamiento por mensajes los guardar generados filtros estandar error envían entrada ejemplos dónde defecto crear comandos comando archivo linux bash redirect

salida - tuberias y filtros en linux



¿Cómo agregar la marca de tiempo al redireccionar la salida estándar al archivo en Bash? (6)

Tengo un programa (servidor) y estoy buscando una forma (script) que redirija (o, mejor, duplique) toda su stdout estándar al archivo y agregue la marca de tiempo para cada entrada.

He investigado un poco y lo más que pude conseguir fue gracias a Cómo agregar la marca de tiempo a la redirección de STDERR . Redirige stdout pero la marca de tiempo agregada es del momento en que finaliza el script:

#!/bin/bash ./server | ./predate.sh > log.txt

Código de predate.sh :

#!/bin/bash while read line ; do echo "$(date): ${line}" done

Parece que la salida del servidor se vacía después de salir del programa (sin redirigir funciona bien). Además, si intento usar predate.sh en el ejemplo dado en el hilo mencionado, funciona perfectamente. Soy consciente de que sería fácil agregar una marca de tiempo al programa principal, pero preferiría evitar editar su código.


Estoy ejecutando un trabajo cron como este:

0 * * * * user /home/user/script.sh >>stdout.log

Luego en script.sh, tengo algo como esto:

#!/bin/bash date do_some_code

Dado que "fecha" es parte de stdout de mi script.sh, la marca de tiempo es la primera línea en cada entrada stdout.log.


Estoy usando el ejemplo anterior: picocom -b 115200 /dev/tty.usbserial-1a122C | awk ''{print strftime ("% s:"), $ 0; fflush (); } ''| tee serial.txt

para volcar / redirigir los datos de salida de telnet en un archivo de registro pero no puedo ejecutar mi script en segundo plano. Si uso ''&'' para ejecutarlo en segundo plano, entonces no funciona.

Punto # 1: Comando de trabajo sin ''&'': script: dumpper.sh telnet $ 1 $ 2 | awk ''{print strftime ("% s:"), $ 0;}'' | tee $ host. $ port.log;

comando: ./dumpper.sh 16.1.1.8 202

Punto # 1: comando que no funciona con ''&'': script: dumpper.sh telnet $ 1 $ 2 | awk ''{print strftime ("% s:"), $ 0;}'' | tee $ host. $ port.log 2> & 1;

comando: ./dumpper.sh 16.1.1.8 20224 &


Hace poco necesitaba exactamente eso: recibir mensajes de registro en una consola serie (picocom), imprimirlos en un terminal y en un archivo Y anteponer la fecha.

Lo que ahora uso miradas en el s.th. Me gusta esto:

picocom -b 115200 /dev/tty.usbserial-1a122C | awk ''{ print strftime("%s: "), $0; fflush(); }'' | tee serial.txt

  • la salida de picocom se canaliza a awk
  • awk anula la fecha (la opción %s convierte la hora a la cantidad de segundos desde 1970-01-01 00:00:00 UTC - o usa %c para un formato legible por humanos)
  • fflush() cualquier salida en búfer en awk
  • que se canaliza hacia el tee que lo desvía a un archivo. (Puedes encontrar algunas cosas sobre tee here )

Para mi tu código funciona perfectamente bien

Mira esto es lo que intenté

test.sh

#!/bin/bash while true; do echo "hello" done

predate.sh

#!/bin/bash while read line; do echo $(date) ":" $line; done

entonces

./test.sh | ./predate.sh

me da

Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello Tue Jan 14 17:49:47 IST 2014 : hello

Esto se puede redirigir a algún archivo usando ">" o ">>" para anexar


Si entiendo que su problema es tener la salida stderr incluida en su archivo log.txt. Correcto ? Si eso es lo que quieres, la solución es:

./servidor 2> & 1 | ./predate.sh> log.txt

Saludos


moreutils ts

$ sudo apt-get install moreutils $ (echo a;sleep 1;echo b;sleep 3;echo c;sleep 2;echo d;sleep 1) | ts | tee myfile $ cat myfile Apr 13 03:10:44 a Apr 13 03:10:45 b Apr 13 03:10:48 c Apr 13 03:10:50 d

o contando desde el inicio del programa:

$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -s 00:00:00 a 00:00:01 b 00:00:04 c 00:00:06 d

o deltas para el benchmarking:

$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -i 00:00:00 a 00:00:01 b 00:00:03 c 00:00:02 d $ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -i ''%.s'' 0.000010 a 0.983308 b 3.001129 c 2.001120 d

Vea también: ¿Cómo monitorear por cuánto tiempo fue la última línea de salida en Bash para la evaluación comparativa de cada línea de la salida estándar?

Probado en Ubuntu 18.04, más utiles 0.60.