Tengo un programa (servidor) y estoy buscando una forma (secuencia de comandos) que redirija (o mejor duplique) toda su stdout estándar al archivo y agregue una marca de tiempo para cada entrada.
Investigué un poco y lo más lejos que pude llegar fue gracias a How to add timestamp to STDERR redirection . 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 trato de 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 prefiero evitar editar su código.
Hace poco necesitaba exactamente eso: recibir mensajes de registro en una consola serie (picocom), imprimirlos en una terminal y en un archivo Y anteponer la fecha.
Lo que ahora uso parece algo así. Me gusta esto:
picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{ print strftime("%s: "), $0; fflush(); }' | tee serial.txtpicocom se canaliza a awkawk antepone la fecha (la opción %s convierte el tiempo a la cantidad de segundos desde 1970-01-01 00:00:00 UTC , o use %c para un formato legible por humanos)fflush() cualquier salida almacenada en búfer en awktee que lo desvía a un archivo. (puedes encontrar algunas cosas sobre tee aquí )más útiles ts
La fecha y la hora absolutas son las predeterminadas:
$ 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 comienzo del programa con ts -s :
$ (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 la evaluación comparativa con ts -i :
$ (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 dProbado en Ubuntu 18.04, moreutils 0.60.
Para mí, su código funciona perfectamente bien
Mira esto es lo que probé
prueba.sh
#!/bin/bash while true; do echo "hello" donepredate.sh
#!/bin/bash while read line; do echo $(date) ":" $line; doneentonces
./test.sh | ./predate.shme 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 : helloEsto se puede redirigir a algún archivo usando ">" o ">>" para agregar
