You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

systemd oneshot关机服务运行数周后失效的问题咨询

systemd oneshot关机服务运行数周后失效的问题咨询

我有一个在关机时触发运行的systemd服务,作用是当Ubuntu 22.04 AWS虚拟机磁盘空间不足时,执行脚本清理所有存储的Docker镜像。

服务配置文件内容如下:

# cat /lib/systemd/system/purge-docker.service
[Unit]
Description=Purge all Docker files on reboot if we're running low on disk space
After=syslog.service network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/usr/local/sbin/purge-docker.sh lowdisk
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=multi-user.target

这个服务一开始已经启动并启用,连续几周运行正常,系统日志里能看到完整的执行记录:

-- Boot c39eb40835574e229dddde806da40539 --
Jun 11 15:30:43 i-023416ba5deadbeef systemd[1]: Finished Purge all Docker files on reboot if we're running low on disk space.
Jun 11 15:33:25 i-023416ba5deadbeef systemd[1]: Stopping Purge all Docker files on reboot if we're running low on disk space...
Jun 11 15:33:25 i-023416ba5deadbeef purge-docker.sh[35434]: Plenty of free space, not purging docker files
Jun 11 15:33:27 i-023416ba5deadbeef systemd[1]: purge-docker.service: Deactivated successfully.
Jun 11 15:33:27 i-023416ba5deadbeef systemd[1]: Stopped Purge all Docker files on reboot if we're running low on disk space.

原本它在AWS实例重启或关机时都能正常工作,但几周后突然失效,再也不往系统日志输出任何内容了。执行systemctl status purge-docker查看状态:

# systemctl status purge-docker
○ purge-docker.service - Purge all Docker files on reboot if we're running low on disk space
Loaded: loaded (/lib/systemd/system/purge-docker.service; enabled; vendor preset: enabled)
Active: inactive (dead)

状态显示服务已启用但处于非活跃状态。按道理启用的服务应该在下次开机时自动启动,但实际完全没反应。而且我发现,启用服务对应的符号链接/etc/systemd/system/multi-user.target.wants/purge-docker.service消失了——这个链接本来是让systemd在开机时启动已启用服务的关键。

如果我手动执行systemctl enable purge-docker,会重新创建这个缺失的链接:

# systemctl enable purge-docker
Created symlink /etc/systemd/system/multi-user.target.wants/purge-docker.service → /lib/systemd/system/purge-docker.service.

执行后状态还是显示“已启用”,但这次是真的能正常工作了:

# systemctl status purge-docker
○ purge-docker.service - Purge all Docker files on reboot if we're running low on disk space
Loaded: loaded (/lib/systemd/system/purge-docker.service; enabled; vendor preset: enabled)
Active: inactive (dead)

还有个更奇怪的现象:如果我先禁用再启用服务,禁用操作删除的是shutdown.target.wants下的链接,而启用操作创建的是multi-user.target.wants下的链接:

# systemctl disable purge-docker
Removed /etc/systemd/system/shutdown.target.wants/purge-docker.service.

# systemctl enable purge-docker
Created symlink /etc/systemd/system/multi-user.target.wants/purge-docker.service → /lib/systemd/system/purge-docker.service.

我现在有几个疑问:

  • 为什么符号链接会莫名其妙消失?
  • 为什么符号链接已经缺失了,systemd还显示服务是“已启用”状态?
  • 为什么服务失效时,虚拟机上会出现shutdown.target.wants的符号链接?

备注:内容来源于stack exchange,提问作者Earl Ruby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:08:12