我有一个实时计时器,Persistent=false
在启动后立即运行,尽管我的目标是定期运行它!
我发现这是一个相当常见的问题,但我在 StackExchange 中找到的答案都没有解决我的问题。我听从了建议这个帖子和这个帖子。
在这里我报告一个简化的示例来重现我的问题。我希望计时器每 5 分钟执行一次(0,5,10,15,...55),但不在启动后执行。
我有以下两个文件,使用
sudo systemctl edit --force --full test.service
和生成
sudo systemctl edit --force --full test.timer
# test.service
[Unit]
Description=test
[Service]
Type=simple
ExecStart=echo "TEST"
# test.timer
[Unit]
Description=test
[Timer]
OnCalendar=*:0/5
Persistent=false
[Install]
WantedBy=default.target
然后我确保使用以下命令禁用该服务
sudo systemctl disable test.service
并使用以下命令启用计时器:
sudo systemctl enable test.timer
现在,当运行 sudo restart 时,test.service
会立即执行。
journalctl -u test
好像:
-- Journal begins at Thu 2023-08-24 02:39:59 UTC, ends at Thu 2023-08-24 19:40:14 UTC. --
Aug 24 19:33:02 rbpi0 systemd[1]: Started test.
Aug 24 19:33:02 rbpi0 echo[463]: TEST
Aug 24 19:33:03 rbpi0 systemd[1]: test.service: Succeeded.
Aug 24 19:35:14 rbpi0 systemd[1]: Started test.
Aug 24 19:35:14 rbpi0 echo[911]: TEST
Aug 24 19:35:14 rbpi0 systemd[1]: test.service: Succeeded.
Aug 24 19:40:14 rbpi0 systemd[1]: Started test.
Aug 24 19:40:14 rbpi0 echo[1352]: TEST
Aug 24 19:40:14 rbpi0 systemd[1]: test.service: Succeeded.
并且您可以清楚地看到test.service
已在19:33
启动时执行...
有人知道错误可能出在哪里吗?
编辑1
我尝试更改该[Install]
部分:
- 尝试 1:完全删除该
[Install]
部分。
结果:
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
Alias= settings in the [Install] section, and DefaultInstance= for template units).
This means they are not meant to be enabled using systemctl.
- 尝试 2:更改
WantedBy=default.target
为WantedBy=timer.target
或WantedBy=multi-user.target
结果:同样的问题。
编辑2
通过阅读定时器手册页我注意到我需要确保系统时钟之前已同步time-sync.target
。我确保时钟已同步,但问题仍然存在。
答案1
计时器单元应该
WantedBy=timer.target
在其[Install]
部分中。如果您希望它在启动顺序中的特定点启动,您应该在计时器和/或服务单元中添加类似
Before=
和/或After=
等的指令。[Unit]
不确定在这种情况下“实时”和“周期性”的区别是什么意思,因为计时器单位实际上都是使
OnCalendar=
它们“周期性”的地方。*:0/5
表示每 5 分钟激活一次,没有具体的启动时间,因此启动后会尽快启动,请参阅输出systemd-analyze calendar --iterations=10 '*:0/5'