Jak zmierzyć, ile czasu zajmuje uruchomienie mojego skryptu ORAZ uwzględnienie go w generowanym e-mailu?

11

Mam prosty skrypt bash, który uruchamia serię kontroli ( ping, nslookup, etc), a następnie wysyła raport e-mail z wyjściem tych danych.

Chcę, aby wiadomość e-mail zawierała informacje o tym, jak długo trwało uruchomienie całego skryptu. Czy istnieje prosty sposób na zebranie tych informacji?

Mike B.
źródło

Odpowiedzi:

15

Proponuję spojrzeć na bashzmienną SECONDS:

SEKUNDY : Za każdym razem, gdy odwołuje się do tego parametru, liczba sekund od momentu wywołania powłoki. Jeśli wartość jest przypisana do SEKUND, wartością zwracaną przy kolejnych referencjach jest liczba sekund od przypisania plus przypisana wartość.

W ten sposób możesz po prostu wydrukować tę zmienną na końcu skryptu. Alternatywnie, jeśli twoim celem jest pomiar czasu tylko części programu, po prostu ustaw SECONDS=0na początku mierzonego bloku poleceń, a na końcu użyj wartości zapisanej w tej zmiennej.

jimmij
źródło
Nigdy nie wiedziałem o $SECONDS; to wspaniale! Aby dodać do tego, możesz przekonwertować sekundy na godziny: minuty: sekundy z czymś podobnym date -d "1970-01-01 ${SECONDS} sec" +'%k:%M:%S'(zobacz man datewięcej opcji formatowania).
Sparhawk
Bardzo podoba mi się to podejście, ale nadal jestem trochę zdezorientowany. Powiedzmy, że uruchamiam ten sam skrypt kilka sekund od siebie. Jeśli ustawię SECONDS=0na jednym skrypcie i to samo na innym skrypcie, czy będą one kolidować ze sobą?
Mike B,
3
Nevermind - natknąłem się na opinie Toma w poście o przepełnieniu stosu ( stackoverflow.com/a/5153036/344780 ), który zasadniczo odejmuje różnicę START_TIME=$SECONDS; dosomething; ELAPSED_TIME=$(($SECONDS - $START_TIME)). Wydaje się to nieco bardziej elastyczne w przypadku jednoczesnego użytkowania.
Mike B,
8

Przedrostek polecenia, /usr/bin/timea polecenie time wyświetli czas potrzebny na uruchomienie skryptu. Jest to bardziej przenośne niż używanie czegoś bashkonkretnego.

Steve Wills
źródło
6

Podczas używania SECONDSi timeda ci względne wartości. Jeśli chcesz mieć bezwzględne wartości dla celów kontroli i raportowania, kiedy skrypt był uruchamiany i kiedy został ukończony, możesz spróbować czegoś takiego przed i po wydaniu poleceń date '+%Y%m%d%H%M%S.%N'. Może to również dać lepszą szczegółowość, ponieważ może uchwycić różnice w sekundach, ponieważ masz polecenia, pingktóre normalnie wykonują się w ciągu sekundy.

Rahul
źródło
1

Zagnieżdż swój skrypt. Aby wysłać wiadomość e-mail, istnieje wiele opcji. Osobiście wolę msmtp, możesz sam zdefiniować nagłówki w stylu „tutaj” (wbudowany) lub użyć osobnego pliku i połączyć je razem. Istnieją różnego rodzaju alternatywy dla Perla, Pythona itp.

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"

Ważna jest końcowa pusta linia. cat twoją złożoną wiadomość do msmtp w ten sposób:

cat assembled.eml | msmtp somebody@somewhere.else

Pesymista zapętlał się aż do sukcesu rozsądną liczbę razy.

Ładunek może być również HTMLem i może być generowany przez php.

Bardzo brzydką alternatywą dla operacji „batchy” na noc jest utworzenie cronjob, a wyniki wysyłane są pocztą e-mail zamiast stdout / stderr.

mckenzm
źródło