Comment mesurer le temps nécessaire à l'exécution de mon script ET l'inclure dans un e-mail qu'il génère?

11

J'ai un simple script bash qui exécute une série de contrôles ( ping, nslookup, etc.) et envoie ensuite un rapport d'email avec la sortie de ces données.

J'aimerais que l'e-mail contienne des informations sur la durée d'exécution de l'ensemble du script. Existe-t-il un moyen simple de collecter ces informations?

Mike B
la source

Réponses:

15

Je suggère de jeter un œil à la bashvariable SECONDS:

SECONDES : chaque fois que ce paramètre est référencé, le nombre de secondes écoulées depuis l'appel du shell est renvoyé. Si une valeur est affectée à SECONDS, la valeur renvoyée lors des références suivantes est le nombre de secondes écoulées depuis l'affectation plus la valeur affectée.

Ainsi, vous pouvez simplement imprimer cette variable à la fin du script. Alternativement, si votre intention est de mesurer le temps d'une partie seulement du programme, alors définissez simplement SECONDS=0au début du bloc de commandes mesuré, et à la fin utilisez simplement la valeur stockée dans cette variable.

jimmij
la source
Je ne l'ai jamais su $SECONDS; c'est génial! Pour ajouter à cela, vous pouvez convertir les secondes en heures: minutes: secondes avec quelque chose comme date -d "1970-01-01 ${SECONDS} sec" +'%k:%M:%S'(voir man datepour plus d'options de formatage).
Sparhawk
J'aime vraiment cette approche mais je suis toujours un peu confus. Supposons que j'exécute le même script à quelques secondes d'intervalle. Si je mets SECONDS=0sur un script et la même chose sur un autre script, vont-ils interférer les uns avec les autres?
Mike B
3
Peu importe - je suis tombé sur les commentaires de Tom dans un article Stack Overflow ( stackoverflow.com/a/5153036/344780 ) qui soustrait essentiellement la différence START_TIME=$SECONDS; dosomething; ELAPSED_TIME=$(($SECONDS - $START_TIME)). Cela semble un peu plus flexible pour une utilisation simultanée.
Mike B
8

Préfixez votre commande avec /usr/bin/timeet la commande time affichera le temps d'exécution du script. C'est plus portable que d'utiliser quelque chose de bashspécifique.

Steve Wills
la source
6

Lors de l'utilisation SECONDSet timevous donnera des valeurs relatives. Si vous souhaitez avoir des valeurs absolues à des fins d'audit et de rapport quant à la date d'exécution et à la fin du script, vous pouvez essayer quelque chose comme ceci avant et après vos commandes date '+%Y%m%d%H%M%S.%N'. Cela pourrait également vous donner une meilleure granularité car il peut capturer des différences de pingmoins d'une seconde car vous avez des commandes comme celles qui s'exécutent normalement en une seconde.

rahul
la source
1

Imbriquez votre script. Pour envoyer un e-mail, il existe plusieurs options. Personnellement, je préfère msmtp pour cela, vous pouvez définir les en-têtes vous-même "ici" style (en ligne) ou utiliser un fichier séparé et les regrouper. Il existe toutes sortes d'alternatives à cela impliquant 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 ligne vierge de fin est importante. cat votre message assemblé dans msmtp ainsi:

cat assembled.eml | msmtp somebody@somewhere.else

Un pessimiste ferait une boucle jusqu'au succès un nombre raisonnable de fois.

La charge utile pourrait également être HTML, et pourrait être générée par PHP.

Une alternative très laide pour une opération "batch" pendant la nuit est de créer un cronjob et la sortie est envoyée par e-mail à la place de stdout / stderr.

mckenzm
la source