экран завершает работу при отключении ssh

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

Я нашёл несколько похожих вопросов, но AFICT они не применимы к моей ситуации.

Некоторые например, этот для tmux и в других местах на Ubuntu предполагают, что это связано с использованием ssh.socket, но в моей установке это даже не используется, она всё ещё на ssh.service.

Я нашёл несколько предложений по отключению автоматического выхода по тайм-ауту, но я не хочу его отключать, я хочу, чтобы screen работал, когда я снова войду. Если я вышел из ssh (с помощью ~.).

Я где-то видел, что это связано с тем, когда сервис запускается. Может ли это быть preset: disabled настройка OpenSSH Daemon?

$> systemctl status ssh*
● sshd.service - OpenSSH Daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: disabled)
     Active: active (running) since Thu 2024-10-17 22:58:56 UTC; 4 months 3 days ago
    Process: 2107 ExecStartPre=/usr/sbin/sshd-gen-keys-start (code=exited, status=0/SUCCESS)
    Process: 2110 ExecStartPre=/usr/sbin/sshd -t $SSHD_OPTS (code=exited, status=0/SUCCESS)
   Main PID: 2112 (sshd)
      Tasks: 1
        CPU: 14.713s
     CGroup: /system.slice/sshd.service
             └─2112 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

Вы пробовали следующее?

loginctl enable-linger
alias screen='systemd-run --scope --user screen'

Бесстыдно позаимствовано из вопросов NixOS.

Ответ или решение

Для решения проблемы с неожиданным завершением сеанса screen при отключении SSH важно понять основной принцип работы screen и взаимодействие его с ssh. Screen – это терминальный мультиплексор, который позволяет запускать несколько сессий в одной консоли и продолжать их выполнение в фоне при отключении. Однако проблема может возникнуть при неправильной конфигурации окружения или использовании системных настроек, которые прекращают выполнение фоновых процессов при завершении SSH-сессии.

Первоначально вы отметили, что используете sshd.service, а не ssh.socket. Это означает, что у вас стандартный способ запуска OpenSSH. Однако, проблема, описанная вами, не должна напрямую зависеть от того, как работает служба SSH, если только не было внесено специфических изменений в конфигурацию системы управления службами systemd.

Теория

Давайте углубимся в структуру работы systemd и SSH. Systemd, как менеджер init, предоставляет возможность управлять сессиями пользователей и демонами через функционал logind. На практике, процессы, запущенные в пользовательских сессиях, могут быть автоматически останавливаемы при завершении сессии по причине процесс-родитель завершил работу. В стандартной конфигурации, screen, будучи дочерним процессом оболочки, которую вы запускаете через SSH, будет закрываться, если оболочка завершает свою работу после отключения.

Пример

Давайте рассмотрим вашу систему и проблему, с которой вы столкнулись, на конкретном примере. У вас запущен OpenSSH Daemon под управлением systemd:

$> systemctl status ssh*
● sshd.service - OpenSSH Daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: disabled)
     Active: active (running) since Thu 2024-10-17 22:58:56 UTC; 4 months 3 days ago
    Process: 2107 ExecStartPre=/usr/sbin/sshd-gen-keys-start (code=exited, status=0/SUCCESS)
    Process: 2110 ExecStartPre=/usr/sbin/sshd -t $SSHD_OPTS (code=exited, status=0/SUCCESS)
   Main PID: 2112 (sshd)
      Tasks: 1
        CPU: 14.713s
     CGroup: /system.slice/sshd.service
             └─2112 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

Вы также упомянули о том, что проблема может быть связана с настройками preset: disabled. На самом деле, это никак не должно влиять на работу screen в фоне.

Применение

Теперь перейдем к решениям, как можно правильно настраивать screen, чтобы избежать проблемы с его завершением при разрыве соединения SSH:

  1. Используйте loginctl для включения фоновой деятельности. Команда loginctl enable-linger <your-username> позволяет поддерживать пользовательские процессы активными даже после завершения сессии. Это потенциально может решить вашу проблему.

  2. Запуск через systemd-run. Вы можете использовать systemd-run для запуска screen в отдельном управляющем cgroup, чтобы они не завершались с завершением сессии SSH. Это делается с помощью следующего алиаса в вашем оболочном профиле:

    alias screen='systemd-run --scope --user screen'

    Эта команда заменяет обычный вызов screen на управление процессами через systemd, что позволяет оставлять их активными.

  3. Проверьте системные конфигурации. Удостоверьтесь в том, что файл конфигурации sshd_config на вашем сервере не имеет специфических настроек, которые могли бы завершать долгие сеансы или влияющие на поддержку фоновых процессов (ClientAliveInterval, ClientAliveCountMax).

  4. Воспользуйтесь disown или nohup. Если проблема не устраняется, можете рассмотреть использование команд, таких как disown или nohup, чтобы запущенные процессы не зависели от начальной оболочки.

Применение этих методов в сочетании может обеспечить, что screen будет работать корректно даже при разрыве SSH-соединения и сможет восстанавливаться позже, когда вы вновь к нему подключитесь. Надеюсь, эти рекомендации помогут вам в решении проблемы с неожиданным завершением сеанса screen.

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

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