系统计时器和条件服务交互

时间:2018-02-15 15:36:27

标签: timer 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)

1 个答案:

答案 0 :(得分:1)

这个问题显然有两个部分,每个部分都没有解决问题。

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

其次,it appears您启动的服务应禁用。这对我来说也没有多大意义,但请记住,systemctl start foo.service仍然可以明确启动已禁用的服务。看起来“启用的服务”只是在满足其条件时自动启动的服务(通常在启动时)。这不是一次性服务应该如何表现的;它应该只是响应计时器而运行。

foo.service的开头仍然可以通过服务本身的条件来控制;当计时器启动服务启动请求时仍然如此。