2013-10-12 4 views
7

Ich habe ein Hauptskript, das alle Skripte in einem Ordner ausführen.Bash-Skript, um Ausführungszeit anderer Skripte zu beobachten

#!/bin/bash 
for each in /some_folder/*.sh 
do 
    bash $each 
done; 

Ich möchte wissen, ob die Ausführung einer von ihnen zu lange dauert (mehr als N Sekunden). Zum Beispiel der Ausführung von Skripts wie:

#!/bin/bash 
ping -c 10000 google.com 

Willen dauern sehr lange, und ich will mein Haupt-Skript zu mir nach N zweiten E-Mail.

Alles, was ich jetzt tun kann, ist alle Skripte mit #timeout N Option auszuführen, aber es stoppt sie! Ist es möglich, mich per E-Mail zu kontaktieren und die Ausführung des Skripts nicht zu stoppen?

+0

Ist es ein Problem, sie alle parallel zu betreiben (Last usw.)? Denn du könntest sie einfach gleichzeitig im Hintergrund laufen lassen und nachschauen. – Wrikken

Antwort

4

Sie etwas tun können:

(sleep 10 ; echo 'Takes a while' | sendmail [email protected]) & 
email_pid=$! 
bash $each 
kill $email_pid 

Der erste Befehl in einer Subshell im Hintergrund laufen. Es schläft zunächst eine Weile und sendet dann E-Mails. Wenn das Skript $each beendet wird, bevor der Schlaf abläuft, wird die Subshell beendet, ohne dass eine E-Mail gesendet wird.

7

Try this:

#!/bin/bash 

# max seconds before mail alert 
MAX_SECONDS=3600 

# running the command in the background and get the pid 
command_that_takes_a_long_time & _pid=$! 

sleep $MAX_SECONDS 

# if the pid is alive... 
if kill &>/dev/null -0 $_pid; then 
    mail -s "script $0 takes more than $MAX_SECONDS" [email protected] < /dev/null 
fi 

Wir haben den Befehl im Hintergrund laufen, schlafen dann für MAX_SECONDS in // Warnung per E-Mail, wenn der Prozess mehr als dauert, was erlaubt ist.

schließlich mit Ihren spezifischen Anforderungen:

#!/bin/bash 

MAX_SECONDS=3600 

alerter(){ 
    bash "$1" & _pid=$! 
    sleep $MAX_SECONDS 
    if kill &>/dev/null -0 $_pid; then 
     mail -s "$2 takes more than $MAX_SECONDS" [email protected] < /dev/null 
    fi 
} 

for each in /some_folder/*.sh; do 
    alerter "$each" & 
    wait $_pid # remove this line if you wou'd like to run all scripts in // 
done 
+0

Tötet dies nicht das laufende Skript, im Gegensatz zu dem, was das OP gefragt hat? – Thomas

+0

Entschuldigung, '-0' vergessen (nur um zu testen, ob das Pid noch am Leben ist, das es nicht tötet) –

Verwandte Themen