Come posso misurare quanto tempo richiede l'esecuzione del mio script e includerlo in un'e-mail che genera?


11

Ho uno script bash semplice che esegue una serie di controlli ( ping, nslookup, ecc) e quindi invia un report via email con l'uscita di tali dati.

Vorrei che l'e-mail includesse informazioni su quanto tempo ha richiesto l'esecuzione dell'intero script. C'è un modo semplice per raccogliere tali informazioni?

Risposte:


15

Suggerisco di dare un'occhiata alla bashvariabile SECONDS:

SECONDI : ogni volta che si fa riferimento a questo parametro, viene restituito il numero di secondi dall'invocazione della shell. Se un valore viene assegnato a SECONDI, il valore restituito nei riferimenti successivi è il numero di secondi dall'assegnazione più il valore assegnato.

Quindi puoi semplicemente stampare questa variabile alla fine dello script. In alternativa, se la tua intenzione è quella di misurare il tempo di solo una parte del programma, imposta semplicemente SECONDS=0all'inizio del blocco misurato di comandi e alla fine usa solo il valore memorizzato in questa variabile.


Non l'ho mai saputo $SECONDS; è fantastico! Per aggiungere a ciò, puoi convertire i secondi in ore: minuti: secondi con qualcosa di simile date -d "1970-01-01 ${SECONDS} sec" +'%k:%M:%S'(vedi man dateper ulteriori opzioni di formattazione).
— Sparhawk,

Mi piace molto questo approccio ma sono ancora un po 'confuso. Diciamo che eseguo la stessa sceneggiatura un paio di secondi l'uno dall'altro. Se imposto SECONDS=0su uno script e la stessa cosa su un altro script, interferiranno l'uno con l'altro?
— Mike B,

3
Nevermind - Mi sono imbattuto nel feedback di Tom in un post Stack Overflow ( stackoverflow.com/a/5153036/344780 ) che sostanzialmente sottrae la differenza START_TIME=$SECONDS; dosomething; ELAPSED_TIME=$(($SECONDS - $START_TIME)). Questo sembra un po 'più flessibile per l'uso simultaneo.
— Mike B,

8

Prefisso il tuo comando con /usr/bin/timee il comando time mostrerà il tempo impiegato per l'esecuzione dello script. Questo è più portatile dell'uso di qualcosa di bashspecifico.


6

Durante l'utilizzo SECONDSe timeti darà valori relativi. Se desideri avere valori assoluti ai fini del controllo e dei rapporti su quando è stato eseguito lo script e quando è stato completato, potresti provare qualcosa di simile prima e dopo i tuoi comandi date '+%Y%m%d%H%M%S.%N'. Questo potrebbe anche darti una granularità migliore in quanto può catturare le differenze dei secondi in quanto hai comandi come quelli pingche normalmente vengono eseguiti in un secondo.


1

Nest la tua sceneggiatura. Per inviare un'e-mail ci sono diverse opzioni. Personalmente preferisco msmtp per questo, puoi definire tu stesso lo stile "qui" delle intestazioni (inline) o usare un file separato e combinarle insieme. Ci sono tutti i tipi di alternative a questo che coinvolgono perl, python ecc.

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 riga vuota finale è importante. cat il tuo messaggio assemblato in msmtp così:

cat assembled.eml | msmtp somebody@somewhere.else

Un pessimista sarebbe in loop fino al successo un numero ragionevole di volte.

Il payload potrebbe anche essere html e potrebbe essere generato da php.

Un'alternativa molto brutta per l'operazione "batchy" durante la notte è quella di creare un cronjob e l'output viene inviato via e-mail al posto di stdout / stderr.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.