web-dev-qa-db-fra.com

assister à un processus pour terminer et exécuter un autre processus

Je souhaite effectuer une synchronisation entre les processus.Mon ordinateur a 2 core.L'utilisateur peut entrer le numéro de simulation à partir de la ligne de commande.Si l'entrée est supérieure à 2, les processus 3 et 3 doivent attendre que l'un des processus soit terminé. Si l'un d'entre eux est terminé, le processus suivant doit être exécuté.Par exemple, le premier processus est déjà en cours et permet de dire que le premier est terminé avant le deuxième processus. On voit que anywait: commande non trouvée. Comment puis-je faire cela? Voici mon script:

#!/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

Vous pouvez réaliser un moyen simple de synchronisation des processus dans bash en utilisant wait qui attend qu'un ou plusieurs travaux en arrière-plan soient terminés avant d'exécuter la suivante.

Vous exécutez généralement des tâches en arrière-plan en ajoutant l'opérateur & à la fin d'une commande. À ce stade, la PID (ID de processus) du processus d'arrière-plan nouvellement créé est stockée dans une variable bash spéciale: La commande $! et wait permet de terminer ce processus avant l'exécution de l'instruction suivante.

Cela peut être démontré par un exemple simple

$ 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"

Commande de sortie

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

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

Vous pouvez voir que le script a pris environ 8 secondes pour s'exécuter complètement. La ventilation sur le temps est

  1. sleep 3 prendra 3 pleins pour terminer son exécution

  2. sleep 4 et sleep 5 sont tous deux lancés séquentiellement l'un après l'autre et il a fallu le maximum (4,5) qui est d'environ ~ 5s à exécuter.

Vous pouvez appliquer la même logique à votre question ci-dessus. J'espère que ça répond à ta question.

11
Inian

Votre code a beaucoup d'autres problèmes, mais la réponse est que vous devez déclarer anywait avant de l'utiliser (déplacez-le donc dans votre script).

Pensez à utiliser http://www.shellcheck.net/ pour au moins supprimer les erreurs les plus évidentes de votre script.

0
Camusensei