У меня есть сервер, на котором запущен сервер Ubuntu. Он находится за прокси ... Не знаю, имеет ли это значение. Но я обнаружил, что несколько процессов, которые я пробовал, завершаются, когда я выхожу из сеанса SSH. Например, у меня есть сервер ноутбука ipython и серверные процессы Mongod, запущенные на этом сервере. Каждый раз, когда я выхожу из системы, оба этих процесса умирают, даже если они выполняются в фоновом режиме с &
Я недавно обнаружил nohud
команда, которая работает фантастически. Однако почему я не сталкивался с этим с большинством серверов? Есть ли какой-то тип по умолчанию на сервере unbuntu, который убивает все процессы пользователя, когда они зависают от SSH? Могу ли я запустить nohud по умолчанию для всех процессов?
Спасибо
Процессы Ubuntu обрабатывают сигналы так же, как и другие дистрибутивы Linux и Unix. Когда сеанс SSH отключается, сигнал SIGHUP отправляется на процесс лидера сеанса, что, вероятно, было бы bash
.
Баш, в свою очередь, убирается за собой:
По умолчанию оболочка закрывается при получении
SIGHUP
. Перед выходом интерактивная оболочка повторно отправляетSIGHUP
ко всем работам, запущенным или остановленным. Остановленные задания отправляютсяSIGCONT
чтобы они получилиSIGHUP
. Чтобы оболочка не отправлялаSIGHUP
сигнал для конкретного задания, его следует удалить из таблицы заданий с помощью встроенной команды disown (см. Встроенные средства управления заданиями) или отмечен как не принимающийSIGHUP
с помощьюdisown -h
.Если
huponexit
опция оболочки была установлена сshopt
(видеть Встроенный магазин), Баш отправляетSIGHUP
ко всем заданиям при выходе из интерактивной оболочки входа.
disown
это встроенная команда Bash. nohup
это внешняя команда с аналогичным эффектом.
Я не рекомендую переконфигурировать Bash, чтобы не убивать все его дочерние процессы (и я не знаю, как это сделать). Скорее, лучшая цель - предотвратить смерть Bash при исчезновении его TTY. Ты можешь использовать screen
, tmux
, или mosh
чтобы сохранить жизнь Башу.