Процессы, запущенные из “su -“, не завершаются при закрытии терминала.

Вопрос или проблема

У меня есть вопрос относительно процессов, запущенных через 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 (сигнал окончания сеанса).
  • Терминальные группы: Процессы могут отсоединиться от терминала и продолжать выполнение в фоновом режиме.

Решения для предотвращения подобной ситуации

Если вам нужно, чтобы все процессы завершались автоматически при закрытии терминала, вы можете рассмотреть следующие подходы:

  1. Использование disown: После запуска вашего процесса, вы можете использовать команду disown, чтобы отделить процесс от терминала, но это может быть не полезно в данной ситуации, так как сами процессы с sleep должны завершаться при закрытии терминала.

  2. Настройка SSH-сервера: В конфигурационном файле SSH-сервера (обычно /etc/ssh/sshd_config), добавьте или измените параметр ClientAliveInterval и ClientAliveCountMax, которые помогут управлять тем, как сервер взаимодействует с клиентом и как лучше завершать процессы.

  3. Использование nohup: Хотя это противоречит вашей цели (завершать процессы при закрытии терминала), для запуска процессов, которые должны продолжать выполняться, можно использовать команду nohup.

  4. Обработка сигнала SIGHUP: Вы можете написать оболочку (скрипт), которая обрабатывает сигнал окончания сеанса и завершает все потоки. Например, можно реализовать сценарий с использованием trap в bash.

Заключение

Чтобы предотвратить возможность выполнения процессов, подобных sleep 3000, после закрытия SSH-сессии, стоит использовать указанные описанные выше методы, адаптируя их под конкретные ваши нужды. Понимание механизма работы процессов и их зависимостей поможет вам более эффективно управлять заданиями на сервере и избежать нежелательных процессов, работающих после завершения сеансов.

Оцените материал
Добавить комментарий

Капча загружается...