2016-04-27 2 views
3

У меня есть скрипт bash с двумя индексами t1 и t2. Оба t1 и t2 являются фоновыми процессами, а t1 вызывает ошибку. Как я могу поймать эту ошибку и полностью завершить весь скрипт?Как выйти из сценария bash, когда один из его фоновых процессов имеет ошибку?

#!/bin/bash 
set -e 

error1() { 
    echo "exit whole script!!!" 
    exit 1 
} 

# this script will rise an error 
./t1.sh & 
pid1=$! 


./t2.sh & 
pid2=$! 


wait $pid2 

if [ $pid2 -eq 0 ]; then 
    trap 'error1' ERR 
fi 


wait $pid1 

if [ $pid1 -eq 0 ]; then 
    trap 'error1' ERR 
fi 

ответ

3

Идея заключается в получении кода возврата фонового процесса и принятии соответствующего решения.

#!/bin/bash 
set -e 
#set -o pipefail 

error1() { 
    echo 'err' 
    exit 1 
} 

# this script (process) will rise an error 
./t1.sh & 
pid_1=$! # Get background process id 


# Getting the process-id of the second process 
./t2.sh & 
pid_2=$! 

# If either of the processes crash with a non-zero error code, wait returns 
# '0' and the 'if' condition fails. 

if wait $pid_1 && wait $pid_2 
then 
    echo -e "Processes termination successful" 
else 
    trap 'error1' ERR # Either of P1 or P2 has terminated improperly 
fi 
+0

Возможно ли запустить t1 и t2 в качестве фонового процесса и прекратить выполнение сценария, когда либо один из них вызывает ошибку? – Michael

+0

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

+0

Я попробовал ваше предложение, но я все еще не могу заставить его работать, он не переходит к ошибке1(). Можете ли вы любезно взглянуть на него? Я редактировал код выше. Большое спасибо – Michael

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