我遇到过这个问题,也做了笔记,正好分享出来。
网络上的类似修改 /etc/ssh/sshd_config、/etc/nsswitch.conf、/etc/resolv.conf 都没用,建议你尝试下面两种办法:
1、重启 systemd-logind 服务
命令:systemctl stop systemd-logind
原因:这应该是系统的一个缺陷,跟systemd有关,systemd-logind主要功能是为每一个登陆session创建一个systemd角度的cgroup管理对象,那些abandoned session应该就是没有及时释放的。
备注:一般使用这个方法,就能马上解决问题,但是问题的根源在哪儿?可以看下第二个办法。
2、PAM 认证
文件目录:/etc/pam.d/
命令:vi /etc/ssh/sshd_config #将UsePAM设为no,重启ssh后,问题解决。
原因:pam_systemd.so 文件导致。(可以在 /etc/pam.d/ 中自行搜索此文件)
备注:pam_systemd 将用户会话注册到 systemd 登录管理器(也就是 systemd-logind.service(8) 服务)中, 因此也同时注册到了 systemd 控制组(control group)之中。
在登录(login)时,此模块与 systemd-logind.service 服务一起, 确保实现如下功能:
如果用户运行时目录(/run/user/$UID)不存在, 那么就创建该目录或者以"tmpfs"文件系统挂载该目录, 同时根据登录用户为该目录设置磁盘配额、属主与属组。
设置 $XDG_SESSION_ID 环境变量的值。 如果开启了审计并且 pam_loginuid.so 运行在此模块之前(强烈建议这么做), 那么将使用审计会话ID(/proc/self/sessionid)的值, 否则将使用独立的会话计数器的值。
为会话创建一个新的 scope 单元。如果此会话是该用户多个并行会话中第一个建立的会话, 那么将会在 user.slice 之下自动创建一个针对该用户的 slice 单元,并将新建的 scope 单元置于其中。 按照会话用户的身份启动一个 user@.service 系统服务实例 (也就是运行一个 systemd 用户实例)。
在退出(logout)时,此模块确保实现如下功能:
如果在 logind.conf(5) 中设置了 KillUserProcesses=yes (无论明确还是隐含), 那么将会杀死会话中的所有进程。如果此会话是该用户多个并行会话中最后一个退出的会话, 那么还会同时终止该用户的 systemd 用户实例以及 slice 单元。
如果此会话是该用户多个并行会话中最后一个退出的会话, 那么将会删除该用户的运行时目录(/run/user/$UID) 以及其中的所有内容。
如果系统的 init 进程不是 systemd , 那么此模块什么也不做,并且立即返回 PAM_SUCCESS 值。
所以问题还是回归到了 systemd-logind.service!
持续跟踪用户的会话、进程、空闲状态。 这将在 user.slice 之下,为每个用户分配一个 slice 单元、为每个用户的当前会话分配一个 scope 单元。 同时,针对每个已登录的用户,将会启动一个专属的服务管理器(作为 user@.service 模版的一个实例)。
生成并管理"session ID"。如果启用了审计并且已经为一个会话设置了审计"session ID", 那么该ID也将同时被用作"session ID", 否则将会使用一个独立的会话计数器(也就是独立生成一个"session ID")。
为用户的特权操作(例如关闭或休眠系统) 提供基于 polkit 的认证与授权
为应用程序实现 阻止关闭/休眠系统的逻辑
处理 硬件关机/休眠按钮的动作
多席位(Multi-Seat)管理
会话切换管理
管理 用户对设备的访问
在启动虚拟终端时 自动启动文本登录程序(agetty), 并管理用户的运行时目录。
用户会话是通过 pam_systemd(8) PAM 模块 在 logind 中注册的。
排查过程借鉴的资料:
https://blog.csdn.net/Bill_Xiang/article/details/78909167
https://blog.csdn.net/Dancen/article/details/115560218