2013-07-17 3 views
0
fork(){ 
    i=0 
    count=0 
    while (($count<5)) 
    do 
     fpfunction & 
     pid=$! 

     #Ensure the pid is available 
     if [ -z "$pid" ]; then 
     echo "IS NULL" 
     else 
     Array[$i]=$pid 
     echo "PID is $pid" 
     fi 

     wait [$pid] 
     i=$((i+1)) 
     count=$((count+1)) 
    done 

    echo "PID: ${Array[*]}" 

} 

Функция fpfunction() только эхо-строка, поэтому я не пишу ее здесь.команда wait в сценарии оболочки

Мое понимание wait() будет ждать завершения дочернего процесса, а затем вернуть значение.

Я положил wait() в свой скрипт, потому что хочу, чтобы все дочерние процессы были закончены.

Однако ошибка

не PID или действительного задания спецификации

Является ли мое понимание не так? пожалуйста, дайте мне знать, как исправить эту проблему.

Большое спасибо.

+0

Я думаю, что выполнение асинхронной команды бессмысленно! Здесь подпроцесс начался в фоновом режиме, а затем сразу же ждал окончания, поэтому вместо части кода используйте просто 'fpfunction', чтобы запустить подпроцесс и дождаться его. Если вы хотите ограничить количество запущенных процессов, я предлагаю использовать 'make'. – TrueY

ответ

4

Если идентификатор процесса, например, 42, то ваш wait инструкция становится:

wait [42] 

, который не то, что вы хотите - квадратные скобки являются проблемой. Оно должно быть:

wait $pid 

по следующему транскрипту:

pax> date ; sleep 60 & 
Wednesday 17 July 10:43:51 WST 2013 
[1] 5200 

pax> pid=$! ; echo $pid 
5200 

pax> wait [$pid] 
bash: wait: '[5200]': not a pid or valid job spec 

pax> wait $pid ; date 
[1]+ Done sleep 60 
Wednesday 17 July 10:44:51 WST 2013 

И, так же, как и в стороне (не имеет отношение к ответу), wait() лучше подходит для функции C wait(), Если вы используете wait из оболочки ,, вы обычно оставляете круглые скобки.

+0

Спасибо за отличный ответ. – Sam

Смежные вопросы