0

背景

我有多个(30 多个)自定义服务/计时器,它们具有相同的结构(在内容部分下方),但时间不同。它们必须仅在计划时执行,并且不能在随机时间手动运行。这些作业背后的应用程序经常更新,并且在更新期间,这些作业必须在更新后禁用/停止并重新启用/按计划启动。

问题

我创建了新的 systemd 计时器/服务文件并将它们放在/etc/systemd/system/. 如何在不手动启动计时器或重新启动服务器的情况下根据 OnCalendar 安排它首次启动?

内容

我有一个服务文件:

# /etc/systemd/system/dummy.service
[Unit]
Description=dummy Service
Wants=dummy.timer

[Service]
Type=oneshot
User=root
ExecStart=/bin/ping -c 30 8.8.8.8
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

以及相应的计时器:

# /etc/systemd/system/dummy.timer
[Unit]
Description=dummy Timer
Requires=dummy.service

[Timer]
Unit=dummy.service
OnCalendar=*-*-* *:00:00
AccuracySec=1ms
RandomizedDelaySec=0

[Install]
WantedBy=timers.target

它们被放入,/etc/systemd/system/然后我运行以下命令来启用计时器:

systemctl daemon-reload
systemctl enable dummy.timer

如果我运行systemctl list-timers --all 'dummy*',输出如下所示,并且计时器永远不会执行..

NEXT LEFT LAST PASSED UNIT        ACTIVATES    
n/a  n/a  n/a  n/a    dummy.timer dummy.service

我可以让它按计划开始运行的唯一方法是重新启动服务器(这不是一个选项)或通过手动启动计时器systemctl start dummy.timer,这也不是我需要的。

我一直在寻找解决方案已经有一段时间了,我能找到的只是手动启动或重新启动。找到任何 SystemD 手册页...

我采用的解决方法是使用systemd-analyze calendar读取下一个运行时间,date将其转换为 %Y%m%d%H%M 格式,然后使用 linuxat命令安排它。这远非优雅,并且对于每周或每月运行一次的作业存在问题,并且在应用程序更新后和预定运行时间之前重新启动服务器。

有任何想法吗?

谢谢!

4

0 回答 0