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.