2017-02-22 3 views
5

В моем сценарии я установил set -e, чтобы остановить обработку, если произошла ошибка. Он хорошо работает для всех команд, работающих на переднем плане, но некоторые из моих команд должны выполняться параллельно в фоновом режиме. К сожалению, если фоновый процесс завершился неудачно, скрипт не остановлен, хотя флаг set -e.set -e и фоновый процесс

Пример работы переднего плана.

#!/bin/bash 
set -e 
ls -l no_file 
sleep 100 

Пример с фоновым процессом не работает.

#!/bin/bash 
set -e 
ls -l no_file & 
sleep 100 

Как обращаться с отказами фоновых процессов?

ответ

5

Запуск команды асинхронно (с &) всегда возвращает статус выхода 0. Для получения фактического статуса выхода команды используйте встроенный wait. Простой пример:

$ (sleep 5; ls -l nofile) & 
[1] 3831 
$ echo $? 
0 
$ wait -n 
ls: cannot access 'nofile': No such file or directory 
[1]+ Exit 2     (sleep 5; ls --color=auto -l nofile) 
$ echo $? 
2 

wait -nждет любого процесса ребенка (который может быть очень полезным). Если вы хотите ждать определенного процесса, вы можете захватить PID при запуске - это в специальной переменной $! - то ждать ПИД:

$ (sleep 5; ls -l nofile) & 
$ myjobpid=$! 
$ # do some other stuff in parallel 
$ wait ${myjobpid} 
ls: cannot access 'nofile': No such file or directory 
[1]+ Exit 2     (sleep 5; ls --color=auto -l nofile) 

Соответствующий раздел руководства Bash озаглавлена «Управление заданиями»

+0

Решение с ожиданием PID - это то, что я ищу. Благодарю. – Marcin

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