2017-07-21 2 views
2

Ich habe ein Skript, wo ich eine spicific Funktion in bestimmten Intervallen ausführen muss, während der Rest des Skripts normal ausgeführt wird.Führen Sie alle 5 Sekunden eine Bash-Funktion aus, lassen Sie aber den Rest des Skripts laufen

Zum Beispiel ... Ich möchte Datenplatte jede Stunde bekommen, während der Rest der Skripte Prozessdaten jede Sekunde sammelt ...

Hier habe ich ein einfaches Skript, dies zu testen, aber es ist nicht wie erwartet funktioniert ...

#!/bin/bash 

function test() { 
echo "This line should print all the time..." 
} 

function test2() { 
echo "This line should only print every 3 seconds..." 
sleep 3 
} 

while : 
do 
    test & 
    test2 
done 

Jede Hilfe wäre .... hilfreich :-D

Dank!

Antwort

1

Erstellen Sie eine Funktion mit einer Endlosschleife und einem Ruhezustand, , und starten Sie sie im Hintergrund. Es wird regelmäßig Dinge tun, während der Rest des Skripts fortgesetzt werden kann.

periodic() { 
    while :; do 
     echo periodic 
     date 
     sleep 3 
    done 
} 

main() { 
    echo in the main... 
    sleep 5 
    echo still in the main... 
    sleep 1 
    echo in the main in the main in the main 
} 

periodic & 
periodic_pid=$! 

echo periodic_pid=$periodic_pid 
main 

echo time to stop 
kill $periodic_pid 
+0

Das funktioniert super! Ich habe einige Änderungen daran vorgenommen, um int zu fangen und den anderen Prozess zu verlassen, aber das hat mich auf den richtigen Weg gebracht! Tausend Dank! – Joe

1

Führen Sie die periodische Funktion in einer Hintergrundschleife aus, und verwenden Sie Ruhezustand, um zwischen den Iterationen 3 Sekunden zu warten. Wenn Sie etwas im Kontext des Hauptprozesses getan haben, senden Sie ihm ein Signal von der Hintergrundschleife. Vergessen Sie nicht, Ihre Hintergrundprozesse beim Beenden zu beenden.

#!/bin/sh 
terms=0 
trap ' [ $terms = 1 ] || { terms=1; kill -TERM -$$; }; exit' EXIT INT HUP TERM QUIT 

#In case the periodic stuff needs to run in the ctx of the main process 
trap 'echo "In main ctx"' ALRM 


test() { 
echo "This line should print all the time..." 
} 

test2__loop() 
{ 
    while :; do 
     echo "This line should only print every 3 seconds..." 
     kill -ALRM $$ 
     sleep 3 
    done 
} 


test2__loop & 
while : 
do 
    test 
    sleep 1 
done 
+0

Das ist auch gut ... Ich habe am Ende eine Falle für ctrl-c benutzt, um die hinterlegte PID am Ausgang zu beenden ... Danke für deinen Beitrag! – Joe

Verwandte Themen