三周内,我的两台 Ubuntu 20.04LTS 服务器systemd
突然变得无响应。症状:
- 所有
systemctl
控制服务或访问日志的命令均失败并显示错误消息:
Failed to retrieve unit state: Connection timed out
Failed to get properties: Connection timed out
systemd
不理会logrotate
重新打开日志的信号,继续写入重命名的日志文件,/var/log/syslog.1
而新创建的日志文件/var/log/syslog
仍为空。- 大量的僵尸进程从 cronjobs 和系统管理任务中积累起来,例如 PID 1 systemd 忽视了其收割孤立进程的职责。
- 正在运行的服务继续正常运行,但无法再启动或停止服务,因为即使旧脚本也重定向
/etc/init.d
到无功能的systemctl
。 Connection timed out
除了尝试与之交互的消息外,日志中没有什么异常systemd
。
通常建议的纠正措施:
systemctl daemon-reexec
kill -TERM 1
- 移除
/run/systemd/system/session-*.scope.d
不要修复问题。唯一的补救措施是重新启动整个系统,这对于地球另一端的服务器来说当然既有破坏性又有问题。
同样的问题在 Ubuntu 16.04LTS 上每月发生一次,大约有 100 台服务器。升级到 20.04LTS 后,发生频率大大降低,但并未完全消失。在 20.04LTS 之后受到影响的两台服务器中,有一台在运行 16.04LTS 时就已经受到影响。
问题:
- 造成此类
systemd
故障的可能原因有哪些? - 我该如何进一步诊断这个问题?
systemd
除了重新启动之外,有没有一种破坏性更小的方法来从无响应中恢复?
答案1
这是一个非常古老的问题,但我希望它可以节省别人的时间。
我遇到了同样的问题,一些僵尸和 systemctl 响应任何请求都会超时。正如预期的那样,问题是删除守护进程。至少在我们的案例中,解决方案是:
telinit u
systemctl daemon-reexec
systemctl daemon-reload