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
相关产品推荐
相关产品推荐

