Рейтинг:0

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

флаг cn

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

nohup some_command &

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

Однако мне нужно получить статус выхода "ошибка" немедленно на случай если какая-то_команда не найден (т. е. когда сообщение об ошибке от bash Данный файл или каталог отсутствует или же команда не найдена).

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


Некоторая справочная информация по вопросам, заданным в комментариях: Это программа с графическим интерфейсом, которая взаимодействует с пользователем. Пользователь вводит какую-либо команду (например, gedit некоторый_файл), и моя программа с графическим интерфейсом выполняет эту команду и немедленно возвращается к циклу, чтобы принять следующую команду от пользователя. Таким образом, введенная команда должна выполняться «отдельно» от программы с графическим интерфейсом. Однако, если пользователь вводит какую-то неверную команду (например, geditxyz) Хочу сразу предупредить пользователя, что команда не найдена.

флаг ar
Вам нужно использовать как `nohup` в начале, так и `&` в конце? Будет ли это работать, если вы используете один или другой?
raj avatar
флаг cn
raj
Под «получить» статус выхода вы имеете в виду получить его программно (для использования позже в сценарии) или просто отобразить его на терминале? Потому что во втором случае bash сделает это сам, если вы установите `set -b`. Попробуйте набрать `nohup nonexistent &`, и вы немедленно получите вывод вроде `[1]+ Exit 127 nohup nonexistent`.
Рейтинг:3
флаг cn

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

Это утверждение изначально неверно:

#!/бин/баш
некоторая_команда &
пид="$!"
ждать -n "$pid"
echo "Статус ${?}."

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

Обработка СИГЧЛД был бы наиболее очевидным вариантом, но (1) его поддержка в Bash глючит и (2) несмотря на установить -б, ловушка обработчики фактически будут ждать границ команд.

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

#!/бин/баш
установить -е

обработчик () {
  echo 'Сигнал об ошибке команды'
  ловушка - ИНТ
}
обработчик ловушек INT

задний план() {
  местный -ir pid="$1"
  сдвиг
  "$@" || убить -INT -- -"$pid"
}
фон "$$" some_command &

# длительная задача переднего плана
echo 'перед длительной обработкой'
спать 5 || echo 'длительная обработка прервана'
echo 'после долгой обработки'

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

FedKad avatar
флаг cn
Спасибо за ответ. Это очень близко к тому, что мне нужно, но все же «несколько сложно». Кроме того, я уточнил свое предыдущее заявление, добавив слово **немедленно**.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.