Вопрос или проблема
Я нашёл несколько похожих вопросов, но 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:
-
Используйте
loginctl
для включения фоновой деятельности. Командаloginctl enable-linger <your-username>
позволяет поддерживать пользовательские процессы активными даже после завершения сессии. Это потенциально может решить вашу проблему. -
Запуск через
systemd-run
. Вы можете использоватьsystemd-run
для запускаscreen
в отдельном управляющем cgroup, чтобы они не завершались с завершением сессии SSH. Это делается с помощью следующего алиаса в вашем оболочном профиле:alias screen='systemd-run --scope --user screen'
Эта команда заменяет обычный вызов
screen
на управление процессами через systemd, что позволяет оставлять их активными. -
Проверьте системные конфигурации. Удостоверьтесь в том, что файл конфигурации
sshd_config
на вашем сервере не имеет специфических настроек, которые могли бы завершать долгие сеансы или влияющие на поддержку фоновых процессов (ClientAliveInterval
,ClientAliveCountMax
). -
Воспользуйтесь
disown
илиnohup
. Если проблема не устраняется, можете рассмотреть использование команд, таких какdisown
илиnohup
, чтобы запущенные процессы не зависели от начальной оболочки.
Применение этих методов в сочетании может обеспечить, что screen
будет работать корректно даже при разрыве SSH-соединения и сможет восстанавливаться позже, когда вы вновь к нему подключитесь. Надеюсь, эти рекомендации помогут вам в решении проблемы с неожиданным завершением сеанса screen
.