it-roy-ru.com

дождаться завершения одного процесса и выполнить другой процесс

Я хочу сделать синхронизацию между процессами. Мой компьютер имеет 2 ядра. Пользователь может ввести номер моделирования из командной строки. Если ввод больше, чем 2, 3-й и остальные процессы должны ждать, пока один из процессов не будет завершен. Если один из них завершен, следующий процесс должен быть выполнен. Например, первые 2 процесса уже продолжаются и, скажем, 1-й завершен до 2-го процесса. Теперь 3-й процесс должен быть выполнен. Я новичок в bash, я понял Видно, что команда anywait: not found. Как я могу это сделать? Вот мой сценарий:

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

Вы можете добиться простого способа синхронизации процессов в bash, используя wait, который ожидает выполнения одного или нескольких фоновых заданий перед выполнением следующего.

Обычно вы запускаете задания в фоновом режиме, добавляя оператор & в конец команды. В этот момент PID (идентификатор процесса) вновь созданного фонового процесса сохраняется в специальной переменной bash: команды $! и wait позволяют завершить этот процесс перед выполнением следующей инструкции.

Это можно продемонстрировать на простом примере

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

Результат команды

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

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

Вы можете видеть, что выполнение сценария заняло ~ 8 секунд. Разбивка по времени

  1. sleep 3 займет 3 секунды, чтобы завершить его выполнение

  2. sleep 4 и sleep 5 запускаются последовательно один за другим, и для их выполнения требуется максимум (4,5), что составляет приблизительно ~ 5 с.

Вы можете применить аналогичную логику к вашему вопросу выше. Надеюсь, что это ответ на ваш вопрос.

11
Inian

В вашем коде есть много других проблем, но ответ таков: вы должны объявить anywait перед его использованием (поэтому переместите его в свой скрипт).

Пожалуйста, рассмотрите возможность использования http://www.shellcheck.net/ , чтобы хотя бы подавить наиболее очевидные ошибки/ошибки в вашем скрипте.

0
Camusensei