2016-10-24 2 views
2

У меня есть сценарий CI, который я хочу ускорить, запустив несколько вещей в фоновом режиме. Я хочу, чтобы сценарий ждал всех процессов и проверял каждый, чтобы узнать, не сработало ли оно.Возможно ли несколько команд в фоновом режиме, но ждать всех результатов и сбой сценария при неудачной команде.

Здесь упрощение:

#!/bin/bash 

set -e 

bg() 
{ 
    sleep .$[ ($RANDOM % 10) + 1 ]s 
} 

bg2() 
{ 
    sleep .$[ ($RANDOM % 10) + 1 ]s 
    exit 1 
} 

bg & # will pass after a random delay 
bg2 & # will fail after a random delay 


# I want the output of the program to be a failure since bg2 fails 

ответ

2

Да.

Вы можете использовать команду wait в bash, чтобы дождаться завершения на одном или нескольких подпроцессах, чтобы завершить работу, и в этом случае мы предоставим PID, чтобы подождать. Кроме того, wait необязательно не принимает аргументов, и в этом случае он ожидает завершения всего фонового процесса.

Пример: -

#!/bin/bash 

sleep 3 & 

wait "$!"  # Feeding the non-zero process-id as argument to wait command. 
       # Can also be stored in a variable as pid=$(echo $!) 

# 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. 

# (or) simply 
# wait < <(jobs -p)  # To wait on all background jobs started with (job &) 

echo "I woke up again" 

Обновление: -

Для определения рабочих мест, когда терпят неудачу, то лучше перебирает список фоновых заданий и журнал их выход из-кода для видимости. Благодаря замечательному предложению от chepner. Это идет как

#!/bin/bash 
for p in $(jobs -p) 
do 
    wait "$p" || { echo "job $p failed" >&2; exit; } 
done 
+0

Что делает ' "$!" 'делать в первой команде ожидания? – Robert

+0

@Robert: получить идентификатор процесса фонового задания, отличное от нуля целое число, которое передается как аргумент команды wait. – Inian

+2

Отсутствует важный аспект исходного вопроса: сбой при сбое фонового задания. Ожидание нескольких фоновых процессов теряет информацию об их статусе выхода; вам нужно ждать отдельных заданий, чтобы увидеть, удастся ли им выполнить или не удается. – chepner

1
#!/bin/bash 

set -e 

bg() 
{ 
    sleep .$[ ($RANDOM % 10) + 1 ]s 
} 

bg2() 
{ 
    sleep .$[ ($RANDOM % 10) + 1 ]s 
    exit 1 
} 

export -f bg 
export -f bg2 

parallel ::: bg bg2 || echo $? of the jobs failed 
+0

Прохладный, предположим, мне нужно установить https://www.gnu.org/software/ параллельный /? – Robert

+0

Вы предполагаете правильно. Но учтите, что для этого вам не нужен root-доступ. –