Выполнить команду в фоновом режиме, но получить ненулевой код выхода * немедленно *, когда `Нет такого файла или каталога`

Мне нужно запустить некоторую (неизвестную) команду в фоновом режиме, например такую:

nohup some_command &

Поскольку такая команда будет выполняться и (надеюсь) завершиться в фоновом режиме, я не могу получить ее статус выхода; это нормально.

Однако мне нужно немедленно получить статус выхода «ошибка» в случае, если some_command не найден (то есть, когда сообщение об ошибке от bash будет Нет такого файл или каталог или команда не найдена ).

Какие могут быть самые короткие и простые альтернативы обхода, которые я могу использовать?

0
задан 19 August 2021 в 22:47

1 ответ

Так как такая команда будет выполняться и (надеюсь) завершиться в фоновом режиме, я не могу получить ее статус выхода; это нормально.

Это утверждение неверно с самого начала:

#!/bin/bash
some_command &
pid="$!"
wait -n "$pid"
echo "Status was ${?}."

Если вы хотите, чтобы вас уведомляли немедленно, вы можете использовать несколько приемов, основанных на сигналах.

Обработка SIGCHLD была бы наиболее очевидным вариантом, но (1) его поддержка в Bash ошибочна и (2) несмотря на set -b , Обработчики прерываний фактически ожидают границы команд.

Тем не менее, следующий лучший вариант (который также прерывает длительную обработку переднего плана немедленно при сбое some_command ) является (эквивалент) генерации Ctrl + C для всего вашего группа процессов. Это доставляется и выполняется немедленно, сама оболочка может обработать сигнал и продолжить при желании, тогда как процесс переднего плана, по-видимому, завершится по умолчанию и т. Д.

#!/bin/bash
set -e

handler() {
  echo 'command failure signalled'
  trap - INT
}
trap handler INT

background() {
  local -ir pid="$1"
  shift
  "$@" || kill -INT -- -"$pid"
}
background "$$" some_command &

# long-running foreground task
echo 'before long processing'
sleep 5 || echo 'long processing interrupted'
echo 'after long processing'

Попробуйте заменить some_command на (например, ) sleep 2 для проверки «успешного» случая.

1
ответ дан 20 August 2021 в 10:25

Другие вопросы по тегам:

Похожие вопросы: