Wie kann gemessen werden, wie lange es dauert, bis mein Skript ausgeführt wird UND in eine E-Mail aufgenommen wird, die es generiert?

11

Ich habe einen einfachen Bash - Skript , das eine Reihe von Kontrollen läuft ( ping, nslookupusw.) und sendet dann einen E - Mail - Bericht mit dem Ausgang dieser Daten.

Ich möchte, dass die E-Mail Informationen darüber enthält, wie lange die Ausführung des gesamten Skripts gedauert hat. Gibt es eine einfache Möglichkeit, diese Informationen zu sammeln?

Mike B.
quelle

Antworten:

15

Ich schlage vor, einen Blick auf bashVariable zu werfen SECONDS:

SEKUNDEN : Jedes Mal, wenn auf diesen Parameter verwiesen wird, die Anzahl der Sekunden seit dem Rückruf der Shell. Wenn SECONDS ein Wert zugewiesen wird, gibt der Wert, der bei nachfolgenden Referenzen zurückgegeben wird, die Anzahl der Sekunden seit der Zuweisung plus den zugewiesenen Wert an.

So können Sie diese Variable einfach am Ende des Skripts drucken. Wenn Sie alternativ nur die Zeit eines Teils des Programms SECONDS=0messen möchten, setzen Sie dies einfach am Anfang des gemessenen Befehlsblocks und verwenden Sie am Ende einfach den in dieser Variablen gespeicherten Wert.

jimmij
quelle
Ich wusste nie davon $SECONDS; das ist großartig! Um dies hinzuzufügen, können Sie Sekunden in Stunden: Minuten: Sekunden mit so etwas wie konvertieren date -d "1970-01-01 ${SECONDS} sec" +'%k:%M:%S'(siehe man dateweitere Formatierungsoptionen).
Sparhawk
Ich mag diesen Ansatz wirklich, aber ich bin immer noch ein wenig verwirrt. Angenommen, ich führe dasselbe Skript ein paar Sekunden voneinander entfernt aus. Wenn ich SECONDS=0ein Skript und dasselbe in einem anderen Skript einstelle, stören sie sich dann gegenseitig?
Mike B
3
Nevermind - Ich bin auf Toms Feedback in einem Stack Overflow-Beitrag ( stackoverflow.com/a/5153036/344780 ) gestoßen, der den Unterschied im Wesentlichen subtrahiert START_TIME=$SECONDS; dosomething; ELAPSED_TIME=$(($SECONDS - $START_TIME)). Dies scheint bei gleichzeitiger Verwendung etwas flexibler zu sein.
Mike B
8

Stellen Sie Ihrem Befehl ein Präfix voran, /usr/bin/timeund der Befehl time gibt die Zeit aus, die das Skript zum Ausführen benötigt hat. Dies ist portabler als die Verwendung von etwas bashBestimmtem.

Steve Wills
quelle
6

Während der Verwendung von SECONDSund erhalten timeSie relative Werte. Wenn Sie absolute Werte für Prüfungs- und Berichtszwecke haben möchten, wann das Skript ausgeführt und wann es abgeschlossen wurde, sollten Sie vor und nach Ihren Befehlen Folgendes ausprobieren date '+%Y%m%d%H%M%S.%N'. Dies könnte Ihnen auch eine bessere Granularität geben, da es Unterschiede von weniger als pingeiner Sekunde erfassen kann, da Sie Befehle haben, die normalerweise innerhalb einer Sekunde ausgeführt werden.

rahul
quelle
1

Verschachteln Sie Ihr Skript. Um eine E-Mail zu senden, gibt es eine Reihe von Optionen. Ich persönlich bevorzuge msmtp, Sie können die Header selbst "hier" (inline) definieren oder eine separate Datei verwenden und sie zusammenfassen. Es gibt alle möglichen Alternativen dazu, einschließlich Perl, Python usw.

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"

Die nachfolgende Leerzeile ist wichtig. katzen Sie Ihre zusammengestellte Nachricht in msmtp so:

cat assembled.eml | msmtp somebody@somewhere.else

Ein Pessimist würde eine vernünftige Anzahl von Schleifen bis zum Erfolg durchlaufen.

Die Nutzdaten könnten auch HTML sein und PHP-generiert werden.

Eine sehr hässliche Alternative für "Batchy" -Operationen über Nacht besteht darin, einen Cronjob zu erstellen, und die Ausgabe wird anstelle von stdout / stderr per E-Mail gesendet.

mckenzm
quelle