问题描述:
在启动时,我们会触发如下所示的服务初始化脚本。该脚本是 Instance 的一部分User Data
。
该脚本将必要的服务/计时器复制到systemd
文件夹并启动计时器。
有时重启后我们的计时器不工作并且停留在N/A
。
该sudo systemctl restart cleanup.timer
命令没有帮助。
只有 sudosystemctl stop cleanup.timer
然后才sudo systemctl start cleanup.timer
有效。
我们不只在特定定时器上遇到此问题。我们有许多定时器,它们具有几乎相同的结构和初始化服务。所有定时器都已加载,但其中一些定时器可能处于active (elapsed)
未工作状态。
我们的设置:
我们跑Ubuntu 18.04 LTS
。
我们有这个服务初始化脚本:
sudo cp <BASIC PATH>/services/cleanup.service /etc/systemd/system/cleanup.service
sudo cp <BASIC PATH>/services/cleanup.timer /etc/systemd/system/cleanup.timer
sudo systemctl daemon-reload
sudo systemctl start cleanup.timer
和这个cleanup.service
:
[Unit]
Description=Service to cleanup things
Requires=docker.service
After=docker.service
[Service]
ExecStart=<<SHELL COMMAND>>
和这个cleanup.timer
:
[Unit]
Description=Timer for service to cleanup things
[Timer]
OnBootSec=1min
OnUnitActiveSec=1800sec
AccuracySec=5sec
[Install]
WantedBy=timers.target
现在检查这些命令:
> sudo systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
n/a n/a n/a n/a cleanup.timer cleanup.service
> sudo systemctl status cleanup.timer
● cleanup.timer - Timer for service to cleanup things
Loaded: loaded (/etc/systemd/system/cleanup.timer; disabled; vendor preset: enabled)
Active: active (elapsed) since Wed 2021-11-17 21:07:22 UTC; 11h ago
Trigger: n/a
Nov 17 21:07:22 ip-XX-XX-XX-XX systemd[1]: Started Timer for service to cleanup things.
问题:
造成这种情况的原因是什么以及如何避免它?
答案1
看起来你忘记了enable
计时器。
systemctl start <unit>
立即启动该计时器(即当您第一次安装它并希望它运行时)。
systemctl enable <unit>
现在不启动该单元,但设置相关的挂钩,以便根据单元文件中的内容启动该单元...
例如计时器将在重启后启动,因为......
[Install]
WantedBy=timers.target
每次启动时都运行服务初始化脚本?
在启动时我们触发服务初始化脚本...我们有这个服务初始化脚本:
这显然没有成功运行,因为 init 脚本应该正在运行,systemctl start cleanup.timer
但是 cleanup.timer 在 11 小时内没有运行或失败了。
因此,我会查看您的 init 脚本周围的日志,以查看失败的原因。可能是您的 init 脚本在 docker 可用之前运行,或者类似情况。
答案2
我对 systemd 还不太熟悉,但据我所知,PATH 环境在启动时尚不可用,因此一些脚本和程序会先设置 PATH 环境。假设您的服务在控制台上运行时会运行,那么情况总是如此。