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

Я добавил следующий сценарий в .bash_profile

if expr "$(ps -o comm= $PPID)" : '^sshd:' > /dev/null; then
  caffeinate -s $SHELL --login
  exit $?
fi

Если процесс является прямым дочерним процессом демона ssh, запустите тот же shell с помощью команды caffeinate(8), чтобы предотвратить засыпание системы во время сеанса ssh.

-1
18.07.2018, 15:19
2 ответа

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

  • Ожидание дочерних элементов, которые уже были завершены, приводит к тому, что waitвозвращает 0.

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

-1
28.01.2020, 05:12

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

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

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

1
28.01.2020, 05:12

Теги

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