it-swarm.com.de

warten Sie, bis ein Prozess abgeschlossen ist, und führen Sie einen anderen Prozess aus

Ich möchte eine Synchronisation zwischen dem Prozess durchführen. Mein Computer hat 2 Kerne. Der Benutzer kann die Simulationsnummer über die Befehlszeile eingeben. Wenn die Eingabe größer als die 2 ist, müssen der dritte und der restliche Prozess warten, bis einer der Prozesse abgeschlossen ist. Wenn einer von ihnen fertig ist, sollte der nächste Prozess ausgeführt werden. Zum Beispiel laufen bereits die ersten 2 Prozesse und sagen wir, der erste ist vor dem zweiten Prozess fertig. Nun sollte der dritte Prozess ausgeführt werden. Ich bin neu in der Bash, habe ich herausgefunden Es ist zu sehen, dass anywait: Befehl nicht gefunden. Wie kann ich das tun? Hier ist mein Drehbuch:

#!/bin/bash
# My first script

count=2
echo -n "Please enter the number of simulation :"
read number
echo "Please enter the algorithm type  "
printf "0 for NNA\n1 for SPA\n2 for EEEA :"

while read type; do
    case $type in
        0 ) cd /home/cea/Desktop/simulation/wsnfuture 
        taskset -c 0 ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/NNA/NNA0/0 &
        taskset -c 1 ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/NNA/NNA0/1 &
        while [ $count -lt $number ]; do
        anywait
            cd /home/cea/Desktop/simulation/wsnfuture 
        mkdir /home/cea/Desktop/simulation/RESULTS/NNA/NNA$count
        taskset -c $((count % 2)) ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/NNA/NNA$count/$count &
            count=$((count + 1))
        done 
        ;;
        1 ) while [ $count -lt $number ]; do
            cd /home/cea/Desktop/simulation/wsnfuture1
        taskset -c $((count % 2)) ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/SPA/$count &
            count=$((count + 1))
        done 
        ;;
        2 ) while [ $count -lt $number ]; do
            cd /home/cea/Desktop/simulation/wsnfuture2
        taskset -c $((count % 2)) ./wsnfuture -u Cmdenv omnetpp.ini > /home/cea/Desktop/simulation/RESULTS/EEEA/$count &
            count=$((count + 1))
        done 
        ;;
        * ) echo "You did not enter a number"
        echo "between 0 and 2."
        echo "Please enter the algorithm type  "
        printf "0 for NNA\n1 for SPA\n2 for EEEA :"

    esac

done

function anywait(){
 while ps axg | grep -v grep | grep wsnfuture> /dev/null; do sleep 1; done
} 
6
eakn

Mit bash können Sie auf einfache Weise die Prozesssynchronisierung in wait durchführen. Dabei wird darauf gewartet, dass ein oder mehrere Hintergrundjobs abgeschlossen sind, bevor der nächste ausgeführt wird.

Im Allgemeinen führen Sie Jobs im Hintergrund aus, indem Sie den Operator & an das Ende eines Befehls anhängen. Zu diesem Zeitpunkt wird die PID (Prozess-ID) des neu erstellten Hintergrundprozesses in einer speziellen Bash-Variablen gespeichert: Mit den Befehlen $! und wait kann dieser Prozess beendet werden, bevor die nächste Anweisung ausgeführt wird.

Dies kann anhand eines einfachen Beispiels demonstriert werden

$ cat mywaitscript.sh

#!/bin/bash

sleep 3 &

wait $!     # Can also be stored in a variable as pid=$!

# Waits until the process 'sleep 3' is completed. Here the wait on a single process is done by capturing its process id

echo "I am waking up"

sleep 4 &
sleep 5 &

wait                    # Without specifying the id, just 'wait' waits until all jobs started on the background is complete.

echo "I woke up again"

Befehlsausgabe

$ time ./mywaitscript.sh
I am waking up
I woke up again

real    0m8.012s
user    0m0.004s
sys     0m0.006s

Sie können sehen, dass die Ausführung des Skripts ca. 8 Sekunden gedauert hat. Die Aufteilung auf die Uhrzeit ist

  1. sleep 3 benötigt volle 3s, um die Ausführung abzuschließen

  2. sleep 4 und sleep 5 werden beide nacheinander gestartet und es hat den Maximalwert (4,5) benötigt, der ungefähr ~ 5 Sekunden beträgt, um ausgeführt zu werden.

Sie können die gleiche Logik auf Ihre obige Frage anwenden. Hoffe das beantwortet deine Frage.

11
Inian

Ihr Code hat viele andere Probleme, aber die Antwort ist, dass Sie anywait deklarieren sollten, bevor Sie ihn verwenden (also in Ihrem Skript nach oben verschieben).

Bitte verwenden Sie http://www.shellcheck.net/ , um die offensichtlichsten Fehler/Irrtümer in Ihrem Skript zumindest zu unterdrücken.

0
Camusensei