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