我正在尝试设置一个每 5 秒运行一次的 systemd 计时器(它将向远程服务器发送实时统计数据),如下所述这里。
服务
[Unit]
Description=PHP Cron
Wants=network.target
After=network.target
[Service]
Type=oneshot
StandardOutput=null
StandardError=syslog
ExecStart=/bin/sh -c "/usr/bin/date >> /tmp/date"
[Install]
WantedBy=multi-user.target
计时器
[Unit]
Description=Run cron service every 5 seconds
[Timer]
OnCalendar=*:*:0/5
不幸的是,计时器非常不规律。
Fri Dec 29 12:21:21 IST 2017
Fri Dec 29 12:21:25 IST 2017
Fri Dec 29 12:21:33 IST 2017
Fri Dec 29 12:21:36 IST 2017
Fri Dec 29 12:21:41 IST 2017
Fri Dec 29 12:21:48 IST 2017
Fri Dec 29 12:21:52 IST 2017
Fri Dec 29 12:22:01 IST 2017
Fri Dec 29 12:22:07 IST 2017
Fri Dec 29 12:22:13 IST 2017
Fri Dec 29 12:22:23 IST 2017
为什么会这样?当间隔小于一分钟时,systemd 计时器是否不可靠?
答案1
默认情况下,systemd 使用非常低的精度,以便多个计时器的作业(即,不同的任务都在几秒钟内发生)可以分组为一次运行,之后系统可以继续空闲。
该选项可以设置[Timer]
,您需要将其设置为1s
或更低。
准确度秒= 指定计时器的精度。默认为 1 分钟。计时器 计划在从指定的时间开始的时间窗口内完成 OnCalendar=、OnActiveSec=、OnBootSec=、OnStartupSec=、OnUnitActiveSec= 或 OnUnitInactiveSec= 并稍后结束使用 AccuracySec= 配置的时间。在 在这个时间窗口,到期时间将被放置在特定于主机的随机的 但稳定的位置,在所有本地计时器单元之间同步。这是 这样做是为了优化功耗,抑制不必要的 CPU 唤醒。 为了获得最佳精度,请将此选项设置为 1us。请注意,计时器仍然 受通过 systemd-system.conf(5) 配置的定时器松弛的影响 TimerSlackNSec= 设置。有关详细信息,请参阅 prctl(2)。为了优化功耗, 确保将该值设置得尽可能高,并尽可能低。