Я добавил следующий сценарий в .bash_profile
if expr "$(ps -o comm= $PPID)" : '^sshd:' > /dev/null; then
caffeinate -s $SHELL --login
exit $?
fi
Если процесс является прямым дочерним процессом демона ssh, запустите тот же shell с помощью команды caffeinate(8), чтобы предотвратить засыпание системы во время сеанса ssh.
Вот как определяется wait
, встроенный в оболочку.
wait
возвращает 0. Некоторые снаряды (напр.ksh93
)имеют кеш для нескольких последних процессов и могут возвращать код выхода для таких дочерних процессов.
Bash wait
возвращает 0 в этом случае, потому что он «помнит», что процесс 72009 был одним из его дочерних процессов, и он помнит коды завершения своих дочерних элементов, и этот код завершения был 0. (Документация здесь несколько вводит в заблуждение. поскольку в нем явно упоминаются «активные» процессы.)
За кулисами wait
определяет, соответствует ли данный идентификатор процесса одному из дочерних элементов оболочки, возможно, в задании; если это так, он проверяет, выполняется ли процесс. Если он все еще работает, он ждет его завершения. По завершении он определяет соответствующий код выхода (, который может быть только для процесса или для задания в целом ), и возвращает его. Существует много дополнительных сложностей для правильной обработки сигналов, подстановки процессов, управления терминалами и т. д., но здесь это не имеет значения.
Код выхода запоминается (как минимум )в таблице заданий. Вы можете увидеть это в действии, запустив две команды с разными кодами выхода(false &
иtrue &
)и дождавшись соответствующих идентификаторов процесса. Пока таблица заданий не очищена, wait
выдаст правильный код выхода. Запустите wait
без аргументов, чтобы удалить завершенные задания из таблицы заданий, и вы увидите, что больше не можете получать коды выхода предыдущих заданий.