背景
我有多个(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
命令安排它。这远非优雅,并且对于每周或每月运行一次的作业存在问题,并且在应用程序更新后和预定运行时间之前重新启动服务器。
有任何想法吗?
谢谢!