Timer Systemd计时器和条件服务交互

Timer Systemd计时器和条件服务交互,timer,systemd,Timer,Systemd,我有一个带条件的systemd服务foo.service,条件是ConditionDirectoryNotEmpty=/tmp/foo。清空/tmp/foo是一种一次性服务 这在隔离状态下正常工作。如果在/tmp/foo保存文件时启动该服务,则该服务将运行并删除该文件。如果不是,则跳过该服务。无论哪种方式,它都在不到一秒钟的时间内运行 当我尝试从关联的计时器启动此服务时,问题就出现了。计时器卡在断开状态systemctl list timers显示foo.timer在过去(!)有一个NEXT条目

我有一个带条件的systemd服务
foo.service
,条件是
ConditionDirectoryNotEmpty=/tmp/foo
。清空
/tmp/foo
是一种一次性服务

这在隔离状态下正常工作。如果在
/tmp/foo
保存文件时启动该服务,则该服务将运行并删除该文件。如果不是,则跳过该服务。无论哪种方式,它都在不到一秒钟的时间内运行

当我尝试从关联的计时器启动此服务时,问题就出现了。计时器卡在断开状态
systemctl list timers
显示
foo.timer
在过去(!)有一个
NEXT
条目,它在一毫秒前启动。事实上,它似乎在不断开火。这当然不是计时器设置:

[Timer]
OnUnitActiveSec=
OnUnitActiveSec=60s
Persistent=true
60秒远不止一分钟。空的
OnUnitActiveSec=
行是故意的;它应该清除任何现有的计时器周期

为什么计时器会发狂?为什么它经常开火,为什么下一次开火是在过去?最重要的是,如何每分钟运行一次服务,但仅在需要时运行


systemd
215版,Debian 8(Armbian 5.30)

这个问题显然有两个部分,每个部分都不能解决问题

计时器应该有
OnBootSec=…
,它定义了启动后服务第一次运行的时间。
OnUnitActiveSec=60s
仅定义计时器事件之间的间隔,不告诉您计时器何时首次触发

其次,您启动的服务应该被禁用。这对我来说也没什么意义,但请记住,禁用的服务仍然可以通过
systemctl start foo.service
显式启动。看起来“已启用的服务”只是在满足条件时(通常在引导时)自动启动的服务。这不是一次性服务的表现;它应该只是响应计时器而运行


foo.service
的启动仍然可以由服务本身的条件控制;当服务启动请求由计时器启动时,情况仍然如此。

这个问题显然有两个部分,每个部分都不能解决问题

计时器应该有
OnBootSec=…
,它定义了启动后服务第一次运行的时间。
OnUnitActiveSec=60s
仅定义计时器事件之间的间隔,不告诉您计时器何时首次触发

其次,您启动的服务应该被禁用。这对我来说也没什么意义,但请记住,禁用的服务仍然可以通过
systemctl start foo.service
显式启动。看起来“已启用的服务”只是在满足条件时(通常在引导时)自动启动的服务。这不是一次性服务的表现;它应该只是响应计时器而运行

foo.service
的启动仍然可以由服务本身的条件控制;当服务启动请求由计时器启动时,仍然是这种情况