¿Cómo puede medir cuánto tiempo tarda mi script en ejecutarse e incluirlo en un correo electrónico que genera?

11

Tengo un script bash simple que ejecuta una serie de comprobaciones ( ping, nslookup, etc) y luego envía un informe por correo electrónico con la salida de los datos.

Me gustaría que el correo electrónico incluya información sobre cuánto tiempo tardó en ejecutarse el script completo. ¿Hay una manera fácil de recopilar esa información?

Mike B
fuente

Respuestas:

15

Sugiero echar un vistazo a la bashvariable SECONDS:

SEGUNDOS : Cada vez que se hace referencia a este parámetro, el número de segundos desde que se devuelve la invocación de shell. Si se asigna un valor a SEGUNDOS, el valor devuelto en referencias posteriores es el número de segundos desde la asignación más el valor asignado.

Por lo tanto, simplemente puede imprimir esta variable al final del script. Alternativamente, si su intención es medir el tiempo de solo una parte del programa, simplemente configúrelo SECONDS=0al comienzo del bloque de comandos medido, y al final simplemente use el valor almacenado en esta variable.

jimmij
fuente
Nunca supe de eso $SECONDS; ¡eso es genial! Para agregar a esto, puede convertir segundos en horas: minutos: segundos con algo como date -d "1970-01-01 ${SECONDS} sec" +'%k:%M:%S'(ver man datepara más opciones de formato).
Sparhawk
Realmente me gusta este enfoque, pero todavía estoy un poco confundido. Digamos que ejecuto el mismo script con un par de segundos de diferencia. Si configuro SECONDS=0un script y lo mismo en otro script, ¿interferirán entre sí?
Mike B
3
No importa: me topé con los comentarios de Tom en una publicación de Stack Overflow ( stackoverflow.com/a/5153036/344780 ) que esencialmente resta la diferencia START_TIME=$SECONDS; dosomething; ELAPSED_TIME=$(($SECONDS - $START_TIME)). Esto parece un poco más flexible para uso simultáneo.
Mike B
8

Prefije su comando con /usr/bin/timey el comando time mostrará el tiempo que tardó en ejecutarse el script. Esto es más portátil que usar algo bashespecífico.

Steve Wills
fuente
6

Mientras usa SECONDSy timele dará valores relativos. Si desea tener valores absolutos para fines de auditoría e informes sobre cuándo se ejecutó el script y cuándo se completó, es posible que desee probar algo como esto antes y después de sus comandos date '+%Y%m%d%H%M%S.%N'. Esto también podría darle una mejor granularidad, ya que puede capturar diferencias de pingmenos de un segundo, ya que tiene comandos como los que normalmente se ejecutan en un segundo.

rahul
fuente
1

Anida tu guión. Para enviar un correo electrónico hay varias opciones. Personalmente, prefiero msmtp para esto, puede definir los encabezados usted mismo al estilo "aquí" (en línea) o usar un archivo separado y juntarlos. Hay todo tipo de alternativas a esto que implican perl, python, etc.

Reply-To: someone@somehost
Sender: someone <someone@somehost>
To: somebody@somewhere.else
Subject: some subject
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/html; charset="iso-8859-1"

La línea en blanco al final es importante. cat su mensaje ensamblado en msmtp por lo tanto:

cat assembled.eml | msmtp somebody@somewhere.else

Un pesimista recorrería hasta el éxito un número razonable de veces.

La carga útil también podría ser html, y podría generarse php.

Una alternativa muy fea para la operación "por lotes" durante la noche, por ejemplo, es crear un cronjob y la salida se envía por correo electrónico en lugar de stdout / stderr.

mckenzm
fuente