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
}
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
sleep 3
prendra 3 pleins pour terminer son exécution
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.
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.