Systemd 服务计时器不工作

Systemd 服务计时器不工作

我创建了一个带有计时器的 systemd 服务,该计时器应该每小时运行一次脚本,但它并不是每小时运行一次。

% cat /etc/systemd/system/myservice.service
[Unit]
Description=Run script after network established
Requires=network-online.target
After=network-online.target

[Service]
Type=simple
RemainAfterExit=yes
ExecStart="/srv/script"

[Install]
WantedBy=multi-user.target

% cat /etc/systemd/system/myservice.timer
[Unit]
Description=Run script every hour

[Timer]
OnBootSec=15min
OnUnitActiveSec=1h

[Install]
WantedBy=timers.target

它确实在网络建立后运行该脚本,但此后它不会继续每小时运行。

sudo systemctl status myservice.{service,timer}

...表明两者都是activeenabled

如何使时间文件引用服务文件?


更多信息:

% systemctl list-timers --system --all
NEXT                        LEFT         LAST                        PASSED       UNIT                         ACTIVATES
~~~~~~~~~~~~~~~~
Sun 2023-09-24 03:10:54 BST 3 days left  Sun 2023-09-17 03:10:50 BST 3 days ago   e2scrub_all.timer            e2scrub_all.service
-                           -            -                           -            fstrim.timer                 fstrim.service
-                           -            Wed 2023-09-20 17:28:10 BST 2h 27min ago myservice.timer              myservice.service

答案1

man systemd.timer说:

请注意,如果要激活的单元在计时器结束时已经处于活动状态,则不会重新启动,而只是继续运行。在这种情况下,不存在生成新服务实例的概念。因此,带有RemainAfterExit=set 的服务(即使在服务的主进程退出后仍持续存在)通常不适合通过重复计时器激活,因为它们只会被激活一次,然后永远保留。

您正在使用RemainAfterExit=yes这会导致服务保留active,即使在/srv/script完成其工作之后也是如此。由于您的服务处于活动状态,因此计时器不会生成另一个实例。

答案可能是删除RemainAfterExit=yes。如果您希望计时器触发任何操作,至少需要确保服务已停止。

相关内容