最近 vps 上的日志被这一个错误给填满了 systemd[10299]: Failed to connect to API bus: Connection refused
错误是最近发生的,这期间因为升级过系统,所以怀疑过是系统问题,然而同样系统的另一个 vps 没有这个错误。Google 搜索也找不到相关信息,只有关于 DBus 的 bug,而且多数已经修复。
仔细研究日志后分析发现,这个错误总是和 ssh 记录的某一特定用户登录日志一起出现,而且出现频率不确定,但当同一时间有多个登录记录时,出现错误几率比较大。
继续分析发现,这个特定的 ssh 用户是用来在多个 vps 之间同步文件的。具体就是这个用户没有登录普通 shell 权限,只能登录后执行一些特定命令后就退出。这个出现错误的 vps 是我的「主」vps,有三个「从」vps 会每分钟以这个特定 ssh 用户的身份登录,执行命令,获取文件,然后退出。
问题是当用户第一次登录的时候,systemd 会新建一个 session,理论上这个 session 会被复用,之后这个用户从另一个客户端登录的时候,会使用同一个 session,只有当这个用户全部退出时,才会删除这个 session。
然而当用户同一时间登录多次,并同一时间退出,再同一时间登录的时候,就会有很大几率造成 session 的错误。具体表现就是 systemd 认为该用户全部退出了,于是删除 session,然而在 session 即将被删却没被删的时候,该用户再次登录,这次登录时因为 session 仍然存在,所以 systemd 试图复用该 session,但是这时 session 却被删除了,于是就出现了连接被拒绝的错误了。
找到了原因就好解决了。让该用户的 session 一直保留就好,sudo loginctl enable-linger USER
观察两天,错误信息没有了,同时原本疑虑的资源占用问题也没有发生。