Systemd 无缘无故地停止了 docker 守护进程

Systemd 无缘无故地停止了 docker 守护进程

我正在尝试调查为什么 systemd 向 dockerd 发送终止信号。这与此有关堆栈溢出帖子

$ journalctl -r

Dec 01 06:25:05 ip-10-38-4-210 dockerd[2218]: time="2020-12-01T06:25:05.867748396Z" level=info msg="Processing signal 'terminated'"
Dec 01 06:25:05 ip-10-38-4-210 systemd[1]: Stopping Docker Application Container Engine...
Dec 01 06:25:03 ip-10-38-4-210 CRON[23453]: pam_unix(cron:session): session closed for user root
Dec 01 06:25:01 ip-10-38-4-210 systemd[1]: Starting Daily apt upgrade and clean activities...
Dec 01 06:25:01 ip-10-38-4-210 CRON[23454]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
Dec 01 06:25:01 ip-10-38-4-210 CRON[23453]: pam_unix(cron:session): session opened for user root by (uid=0)
Dec 01 06:17:01 ip-10-38-4-210 CRON[23441]: pam_unix(cron:session): session closed for user root
Dec 01 06:17:01 ip-10-38-4-210 CRON[23442]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Dec 01 06:17:01 ip-10-38-4-210 CRON[23441]: pam_unix(cron:session): session opened for user root by (uid=0)
Dec 01 06:06:54 ip-10-38-4-210 CRON[23406]: pam_unix(cron:session): session closed for user root

docker 开始停止之前的最后一个日志条目是CRON[23453]: pam_unix(cron:session): session closed for user root,这看起来与您有关吗?

这是在 x86-64 上的 Ubuntu 16.04.6 LTS 上

答案1

在这种特定情况下,告诉 systemd 停止 docker 服务的事情似乎是 Ubuntu 无人值守更新服务应用更新了 Ubuntu 版本的 containerd 软件包。有一个悬而未决的问题,表明许多其他人今天也受到同样问题的影响:

https://bugs.launchpad.net/ubuntu/+source/containerd/+bug/1870514

在该链接的期刊中,该期刊包括:

Apr 03 06:09:31 server systemd[1]: Starting Daily apt upgrade and clean activities...
...
Apr 03 06:09:43 server systemd[1]: Stopping Docker Application Container Engine...

我建议的修复方法是从上游 Docker 存储库安装 docker,该存储库似乎不存在此问题:

https://docs.docker.com/engine/install/ubuntu/

答案2

我知道已经有一个被接受的答案但是......

docker 开始停止之前的最后一个日志条目是 CRON[23453]: pam_unix(cron:session): session returned for user root,这看起来与您有关吗?

是的,这似乎确实相关,但不是在这种情况下,仍然在这里回答,以便将来运行无根 docker 的人遇到这个问题可以获得解决方案。

-d我在无根模式下设置了 docker,并尝试在我自己的用户ubuntu(它是一个 AWS Lightsail 实例)下以分离模式(标志)托管长期运行的 docker 容器。这导致我的 docker 守护进程以及我的容器正常关闭。

解决方案

启用逗留

sudo loginctl enable-linger $USER

为了确定起见,请编辑/etc/systemd/logind.conf以下行并将其添加到末尾。

UserStopDelaySec=infinity
KillUserProcesses=no

重新启动计算机以使新配置生效。

sudo reboot

罪魁祸首

罪魁祸首恰好是systemd它如何处理由登录会话(恰好是 SSH 终端会话)启动的进程。默认情况下,在用户注销后systemd发送SIGTERM到进程10s根据文档

UserStopDelaySec=

指定保留用户记录和每用户服务的时间[电子邮件受保护]用户完全注销后。如果设置为零,则当用户的最后一个会话结束时,每用户服务将立即终止。如果此选项配置为非零快速注销/登录周期会加快,因为用户的服务管理器不会不断重新启动。如果设置为“无限”,则用户的每用户服务在首次登录后将不再终止,并继续运行直到系统关闭。默认为 10 秒。

KillUserProcesses=

采用布尔参数。配置用户注销时是否应终止用户的进程。如果为 true,则与会话对应的范围单元以及该范围内的所有进程都将终止。如果为 false,则范围被“放弃”,请参阅 systemd.scope(5),并且进程不会被终止。默认为“否”,但请参阅下面的选项 KillOnlyUsers= 和 KillExcludeUsers= 。

当然除非启用了逗留模式,记录在这里

enable-linger [USER...], disable-linger [USER...]

启用/禁用一名或多名用户的用户延迟。如果为特定用户启用,则会在启动时为该用户生成一个用户管理器,并在注销后保留。这允许未登录的用户运行长时间运行的服务。采用一个或多个用户名或数字 UID 作为参数。如果未指定参数,则为调用方会话的用户启用/禁用延迟。

写了一篇关于它的博客如果您想查看的话,可以提供更多详细信息。

相关内容