Когда вы выключаете или перезагружаете свою систему, systemd
пытаетесь остановить все службы настолько быстро, насколько это возможно. Это включает в себя отключение сети и завершение всех процессов, которые еще живы - обычно в таком порядке. Поэтому, когда systemd убивает разветвленные процессы SSH, которые обрабатывают ваши сеансы SSH, сетевое соединение уже отключено, и у них нет возможности изящно закрыть клиентское соединение.
Ваша первая мысль может состоять в том, чтобы просто завершить все процессы SSH в качестве первого шага во время выключения, и существует довольно много системных служебных файлов, которые делают именно это.
Но, конечно, есть более точное решение (как это должно быть сделано) systemd-logind
.
systemd-logind
отслеживает активные пользовательские сессии (локальные и SSH) и назначает все процессы, порожденные в них, так называемым «срезами». Таким образом, когда система выключается, systemd может просто SIGTERM все внутри пользовательских срезов (что включает в себя разветвленный процесс SSH, который передает определенный сеанс), а затем продолжать закрывать службы и сеть.
systemd-logind
требуется модуль PAM для получения уведомлений о новых сеансах пользователя, и вам необходимо dbus
использовать его loginctl
для проверки его состояния, поэтому установите оба из них:
apt-get install libpam-systemd dbus
Убедитесь, что на /etc/ssh/sshd_config
самом деле вы собираетесь использовать модуль с UsePAM yes
.