Intereting Posts
Как имитировать периодическое нажатие кнопки на веб-странице? Ошибка при обновлении ubuntu (ошибки были обнаружены во время обработки) определение локали с французским республиканским календарем Утилита для отправки HTML-почты с вложениями в длинный список писем? Как я могу создать файлы в каталоге, чтобы иметь inodes, назначенные для файлов с номерами последовательных индексов? Двойные мониторы, разрешение разрешения DVI-I-VGA-конвертера Сценарий Bash для перебора файлов Мониторинг ошибок синхронизации Fcs В AWK можно указать диапазон для работы? Используйте emacs как редактор внутри себя (ansi-term) Как восстановить отсутствующий файл Grub На LMDE 2, почему мой экран отключается через несколько секунд? Является ли количество tty максимальным количеством одновременных сеансов? Как исправить ошибки ld-linux-x86-64.so.2 CRC? Как скопировать большие данные по сети?

Команда ожидания работает, когда pid не существует

Я столкнулся с неожиданным поведением встроенного ожидания.

~ ❯ sleep 1 & [1] 72009 ~ ❯ [1] + 72009 done sleep 1 ~ ❯ wait 72009 ~ ❯ echo $? 0 

Хотя PID больше не существует, ожидание по-прежнему завершается с нулевым статусом выхода.

Вопросы

  • В чем причина такого поведения?
  • Как работает ожидание? Что это делает за кулисами?

Ожидание Bash в этом случае возвращает 0, потому что он «помнит», что процесс 72009 был одним из его дочерних элементов, и он запоминает свои дочерние коды выхода, и этот код выхода был 0. (Документация здесь вводит в заблуждение, поскольку упоминает «активные» процессы в явном виде.)

За кулисами wait определяет, соответствует ли данный идентификатор процесса одному из потомков оболочки, возможно, в задании; если это так, он проверяет, запущен ли еще процесс. Если он все еще работает, он ждет его завершения. По завершении он определяет соответствующий код выхода (который может быть только для процесса или для работы в целом) и возвращает его. Существует много дополнительных сложностей для правильной обработки сигналов, подстановки процессов, управления терминалами и т. Д., Но здесь это не имеет значения.

Код выхода запоминается (как минимум) в таблице заданий. Это можно увидеть в действии, запустив две команды с разными кодами выхода ( false & и true & ) и дождавшись соответствующих идентификаторов процесса. Пока таблица заданий не очищена, wait даст правильный код выхода. Запустите wait без аргументов, чтобы удалить завершенные задания из таблицы заданий, и вы увидите, что больше не можете получить коды завершения предыдущих заданий.

Вот как определяется встроенное в оболочку wait .

  • ожидание детей, которые уже были прерваны, вызывает wait возврата 0.

Некоторые оболочки (например, ksh93 ) имеют кэш для последних нескольких процессов и могут возвращать код выхода для таких дочерних ksh93 .