2016-11-10 2 views
0

Ich lerne Bash Scripting und ich möchte eine Funktion alle 5 Sekunden für x Anzahl von Sekunden aufrufen. Das x wird durch das Befehlszeilenargument bestimmt, wenn das Skript ausgeführt wurde. Ich habe versucht zu wachen, aber es scheint für immer weiter zu gehen, ich habe nicht die Fähigkeit, nach x Sekunden zurückzukehren. Es könnte einen Schlafstil geben, aber es wirkt plump und ich muss mich mit lokalen Drift befassen. Gibt es eine elegante Lösung?Shell Script zum Ausführen des Befehls alle 5 Sekunden für x Anzahl der Sekunden

Mein Code:

#!/bin/bash 

if [ $# -ne 1 ]; then # only 1 command line arg allowed 
    echo "Incorrect arguments" 
    exit 1 
elif ! [[ $1 =~ ^[0-9]+$ ]]; then # arg must be digit 
    echo "Argument must be a positive number" 
    exit 1 
fi 

ask() 
{ 
    OUTPUT=$(snmpwalk -v2c -c community server oib) 
    CLEANOUTPUT="${OUTPUT:32}%" 
    echo $CLEANOUTPUT 
} 

#export -f ask 
#watch -n5 ask 

Antwort

2

Die SECONDS Variable zählt die Anzahl der Sekunden seit bash gestartet wurde:

#!/bin/bash 

while ((SECONDS <= 20)) 
do 
    echo "Running something" 
    sleep 5 || break 
done 
echo "Done" 

Dieses einfache Verfahren wird sleep 5 nach dem letzten Lauf, auch wenn Sie wissen, Es dauert mehr als 20 Sekunden, und es versucht nicht, die Laufzeit des Befehls zu berücksichtigen (wenn der Befehl 2 Sekunden lang ausgeführt wird, wird er am Anfang gestartet alle 7 Sekunden).

+0

danke für den Tipp auf SECONDS –

+0

Warum der 'Schlaf 5 || Pause "? Schlägt Sleep nicht 0 zurück, so dass Pause nie aufgerufen wird? Selbst wenn es hieß, was würde es tun, kurz bevor es fertig war? –

+0

'sleep' gibt nicht null zurück, wenn sie abgebrochen wird oder wenn sie mit einem Zeitbezeichner aufgerufen wird, den die aktuelle Plattform als ungültig betrachtet, wie GNUs '0.5' oder' 1m', oder wenn die Zeitvariable aus irgendeinem Grund leer oder falsch ist –

0
#!/bin/bash 
if [ $# -ne 1 ]; then # only 1 command line arg allowed 
    echo "Incorrect arguments" 
    exit 1 
elif ! [[ $1 =~ ^[0-9]+$ ]]; then # arg must be digit 
    echo "Argument must be a positive number" 
    exit 1 
fi 

iterations=$(($1/5)) 
for i in $(seq 1 $iterations); 
do 
     OUTPUT=$(snmpwalk -v2c -c community server oib) 
     CLEANOUTPUT="${OUTPUT:32}%" 
     echo $CLEANOUTPUT 
     sleep 5 
done  
+0

(ich weiß empfohlen, schlafen war nicht nur gedacht, das ich dir zeigen würde, wie ich es tun würde) – UltrasoundJelly

+0

Sorry, ich es wollte nicht laufen für x mal, wollte ich es für x Anzahl von Sekunden laufen. Also wenn ich 20 in die Befehlszeile einfüge, sollte es für 20 Sekunden laufen und alle 5 Sekunden ausgeben, also würde ich 4 Ausgaben bekommen –

+0

änderte meine Antwort. Soweit ich weiß, gibt es keine Möglichkeit, die Wiedergabe nach einer bestimmten Anzahl von Iterationen zu stoppen. – UltrasoundJelly

1

Wenn Sie ein wenig genauer mit dem Timing sein wollen, können Sie eine sleep in den Hintergrund stellen, tun, was Arbeit erforderlich ist, dann verwenden wait, die Vordergrundverarbeitung, bis die sleep Ausfahrten halten wird. Obwohl die Genauigkeit nicht perfekt ist, ist zumindest die Zeit, die der Arbeitsteil benötigt, nicht enthalten.

Etwas wie:

#!/bin/bash 

LOOPTIMES=3 
REPEATEVERY=5 # seconds 

for ((count=0 ; $count < $LOOPTIMES ; count++)) 
do 
    /bin/sleep $REPEATEVERY & 

    echo "Doing work $count..." 
    # do whatever 

    wait # this will wait until the sleep exits 
done 

exit 0

Verwandte Themen