Answers:
当您关闭或重新引导系统时,请systemd
尝试尽快停止所有服务。这涉及关闭网络并终止所有仍在运行的进程-通常按此顺序进行。因此,当systemd杀死正在处理SSH会话的分叉SSH进程时,网络连接已被禁用,它们无法正常关闭客户端连接。
您的第一个想法可能是在关闭过程中首先杀死所有SSH进程,并且有很多systemd服务文件可以执行此操作。
但是有一个过程整洁溶液(它是如何“应该”做)systemd-logind
。
systemd-logind
跟踪活动的用户会话(本地和SSH),并将其中产生的所有进程分配给所谓的“切片”。这样,当系统关闭时,systemd可以对用户片中的所有内容(包括处理特定会话的分叉SSH进程)执行SIGTERM操作,然后继续关闭服务和网络。
systemd-logind
需要一个PAM模块来通知新的用户会话,并且您需要dbus
使用它loginctl
来检查其状态,因此请安装以下两者:
apt-get install libpam-systemd dbus
确保您/etc/ssh/sshd_config
实际上将与一起使用该模块UsePAM yes
。
reboot
,请执行shutdown -r
默认为1分钟延迟的a ,而不是,这样您就有时间关闭SSH会话。
您需要在客户端而不是服务器端进行设置。编辑您~/.ssh/config
要包含
ServerAliveInterval 15
ServerAliveCountMax 5
这意味着在闲置15秒钟后,您的客户端将向服务器发送一条消息。如果未收到任何响应,它将最多尝试5次,如果仍未收到答复,它将关闭会话。
此行为是在Debian Bug上报告的,您只需要正确设置软件包附带的关闭脚本,因为默认情况下不会自动复制它们:
cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl enable ssh-session-cleanup.service
不幸的是,多年来,serverfault并没有让我以太少的分数回答线程问题。但是我不需要在其他博客中发送垃圾邮件即可获得解锁的^^ ...,因此可以专门回答:
正如Rfraile所说
cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl enable ssh-session-cleanup.service
作品。要在不重新启动实例/服务器的情况下使用它,您应该执行其他任务:
systemctl daemon-reload
systemctl start ssh-session-cleanup.service
因此该服务已注册并启动,并且systemd需要将其停止以进行重新引导/关闭。