2016-03-17 3 views
1

У меня есть 4 сценария оболочки, первые 3 скрипта, которые я хочу выполнить параллельно. Позже после успешного завершения всех трех сценариев я хочу выполнить 4-й скриптЗапустить сценарий оболочки после успешного выполнения скриптов parellel

Parellelexecution 
    sh script1.sh, 
    sh script2.sh, 
    sh script3.sh 

script4.sh должен выполнить после всех 3-х исполнений.

ответ

2

В Баш вы можете сделать:

pids= 
for s in script1.sh script2.sh script3.sh; do 
    $s & 
    pids="$pids $!" 
done 

JOBS_FAILED=false 
for pid in $pids; do 
    if ! wait $pid; then 
     # script didn't exit successfully 
     JOBS_FAILED=true 
    fi 
done 

if [[ $JOBS_FAILED == false ]]; then 
    script4.sh 
fi 

Сначала он запускает все первые 3 сценария в фоновом режиме и собирает их ИДП. Затем он проходит через каждый pid, ожидая его выхода и проверки его возвращаемого значения. Если какой-либо из первых трех сценариев не работает, $JOBS_FAILED устанавливается в строку true, но все процессы все еще ждут. После завершения всех первых 3 скриптов скрипт проверяет, не сработали ли какие-либо задания. Если нет, запускается script4.sh.

+0

Вместо выхода из первого отказа вы можете просто установить флаг 'JOB_FAILED'. После завершения всех фоновых заданий запустите 'script4.sh', только если' JOB_FAILED' не установлен. – chepner

+0

@chepner Хорошая идея. Я обновил свой ответ. Благодарю. –

+0

@KurtStutsman Спасибо всем, Точно, что я искал – prakash

2

bash 4.3 добавлен флаг -n на номер wait, что позволяет подождать, пока не будет выполнена какая-либо одна фоновая работа. Для фиксированного числа фоновых заданий, вы могли бы сделать что-то вроде использования

script1.sh & 
script2.sh & 
script3.sh & 
wait -n && wait -n && wait -n && script4.sh 

Для большого или переменного числа фоновых заданий, ответ Курта лучше.

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