Поскольку такая команда будет выполняться и (надеюсь) завершаться в фоновом режиме, я не могу получить ее статус выхода; это нормально.
Это утверждение изначально неверно:
#!/бин/баш
некоторая_команда &
пид="$!"
ждать -n "$pid"
echo "Статус ${?}."
Если вы хотите получать уведомления немедленно, вы можете использовать несколько приемов, основанных на сигналах.
Обработка СИГЧЛД
был бы наиболее очевидным вариантом, но (1) его поддержка в Bash глючит и (2) несмотря на установить -б
, ловушка
обработчики фактически будут ждать границ команд.
Тем не менее, следующий лучший вариант (который также прерывает длительную обработку переднего плана немедленно когда какая-то_команда
терпит неудачу) является (эквивалентом) генерации Ctrl+C для всей вашей группы процессов. Это доставляется и выполняется немедленно, оболочка сама может обработать сигнал и продолжить, если это необходимо, тогда как процесс переднего плана, предположительно, завершится по умолчанию и т. д.
#!/бин/баш
установить -е
обработчик () {
echo 'Сигнал об ошибке команды'
ловушка - ИНТ
}
обработчик ловушек INT
задний план() {
местный -ir pid="$1"
сдвиг
"$@" || убить -INT -- -"$pid"
}
фон "$$" some_command &
# длительная задача переднего плана
echo 'перед длительной обработкой'
спать 5 || echo 'длительная обработка прервана'
echo 'после долгой обработки'
Попробуйте заменить какая-то_команда
с (например) спать 2
проверить «успешный» случай.