我正在尝试调查为什么 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,该存储库似乎不存在此问题:
答案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 作为参数。如果未指定参数,则为调用方会话的用户启用/禁用延迟。
我写了一篇关于它的博客如果您想查看的话,可以提供更多详细信息。