我有条件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)
答案 0 :(得分:1)
这个问题显然有两个部分,每个部分都没有解决问题。
计时器应该有OnBootSec=...
,它定义了服务在启动后第一次运行。 OnUnitActiveSec=60s
仅定义计时器事件之间的间隔,并且不会告诉您计时器何时首次触发。
其次,it appears您启动的服务应禁用。这对我来说也没有多大意义,但请记住,systemctl start foo.service
仍然可以明确启动已禁用的服务。看起来“启用的服务”只是在满足其条件时自动启动的服务(通常在启动时)。这不是一次性服务应该如何表现的;它应该只是响应计时器而运行。
foo.service
的开头仍然可以通过服务本身的条件来控制;当计时器启动服务启动请求时仍然如此。