Вопрос или проблема
У меня есть вопрос относительно процессов, запущенных через SSH-сессию, после выполнения su - user
. Мой вопрос касается RHEL 8, но также может относиться и к другим операционным системам. SSH-соединение инициируется с машины под управлением Windows.
Сценарий использования следующий:
- войти как
user
через SSH - выполнить
sudo su -
чтобы переключиться на
root
- выполнить
sleep 3000
- закрыть ваш SSH-терминал (например, закрыть окно mobaxterm)
В этом случае процесс sleep 3000
продолжает выполняться.
Это ожидаемое поведение? И есть ли способ предотвратить это?
Ответ или решение
Вопрос, который вы рассматриваете, касается поведения процессов, созданных через команду su -
в операционной системе RHEL 8 (и на других системах), особенно в контексте SSH-сессий. Давайте подробно разберем, что происходит в данном сценарии и как можно изменить такое поведение.
Понимание поведения процессов при использовании su -
Когда вы выполняете команду sudo su - user
, вы переключаетесь на учетную запись другого пользователя с полным окружением, включая системные переменные, как будто вы вошли в систему под ним. Запущенные вами процессы, такие как sleep 3000
, наследуют атрибуты родительского процесса.
Подходящие атрибуты процессов
По умолчанию процессы, запущенные в терминале, не привязываются к сеансу или терминалу, если они не были специально настроены на это. Когда вы закрываете окно MobaXterm или другой SSH-клиент, сеанс SSH прекращается, но процессы, запущенные через su -
, продолжают свою работу, так как они не привязаны к вашему терминалу. Это поведение ожидаемо, так как процессы работают в контексте родительского процесса, который, в данном случае, уже завершился.
Ожидаемое поведение
Да, это поведение является ожидаемым. В Unix-подобных системах, процессы, запущенные интерактивно, продолжают работу даже после завершения терминала, если это не было специально предусмотрено. Это включается в семейство механизмов, таких как:
- Детей процессов: Когда родительский процесс завершает свою работу (в данном случае, SSH-сессия), дочерние процессы могут продолжать выполняться, если они не были настроены для завершения по сигналу
SIGHUP
(сигнал окончания сеанса). - Терминальные группы: Процессы могут отсоединиться от терминала и продолжать выполнение в фоновом режиме.
Решения для предотвращения подобной ситуации
Если вам нужно, чтобы все процессы завершались автоматически при закрытии терминала, вы можете рассмотреть следующие подходы:
-
Использование
disown
: После запуска вашего процесса, вы можете использовать командуdisown
, чтобы отделить процесс от терминала, но это может быть не полезно в данной ситуации, так как сами процессы сsleep
должны завершаться при закрытии терминала. -
Настройка SSH-сервера: В конфигурационном файле SSH-сервера (обычно
/etc/ssh/sshd_config
), добавьте или измените параметрClientAliveInterval
иClientAliveCountMax
, которые помогут управлять тем, как сервер взаимодействует с клиентом и как лучше завершать процессы. -
Использование
nohup
: Хотя это противоречит вашей цели (завершать процессы при закрытии терминала), для запуска процессов, которые должны продолжать выполняться, можно использовать командуnohup
. -
Обработка сигнала
SIGHUP
: Вы можете написать оболочку (скрипт), которая обрабатывает сигнал окончания сеанса и завершает все потоки. Например, можно реализовать сценарий с использованием trap в bash.
Заключение
Чтобы предотвратить возможность выполнения процессов, подобных sleep 3000
, после закрытия SSH-сессии, стоит использовать указанные описанные выше методы, адаптируя их под конкретные ваши нужды. Понимание механизма работы процессов и их зависимостей поможет вам более эффективно управлять заданиями на сервере и избежать нежелательных процессов, работающих после завершения сеансов.