我创建了一个带有计时器的 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}
...表明两者都是active
和enabled
。
如何使时间文件引用服务文件?
更多信息:
% 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
。如果您希望计时器触发任何操作,至少需要确保服务已停止。