Мне нужно запустить некоторую (неизвестную) команду в фоновом режиме, например такую:
nohup some_command &
Поскольку такая команда будет выполняться и (надеюсь) завершиться в фоновом режиме, я не могу получить ее статус выхода; это нормально.
Однако мне нужно немедленно получить статус выхода «ошибка» в случае, если some_command
не найден (то есть, когда сообщение об ошибке от bash будет Нет такого файл или каталог
или команда не найдена
).
Какие могут быть самые короткие и простые альтернативы обхода, которые я могу использовать?
Так как такая команда будет выполняться и (надеюсь) завершиться в фоновом режиме, я не могу получить ее статус выхода; это нормально.
Это утверждение неверно с самого начала:
#!/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
для проверки «успешного» случая.