我正在使用 CoreOS 和 SystemD 计时器来运行我的报告...
我有某些监控报告需要在接下来的 12 小时内每 3 小时运行一次,每半小时运行一次。如果我想在 1230 点醒来以停止报告,那么实现起来非常简单。
systemd 计时器中是否有“终止计时器”选项或类似的选项>
我相信您可以将以下内容添加到服务文件的 [Unit] 指令中:
JobTimeoutSec=43200
您可能只需编写一个包装脚本来在 12 小时后终止该进程或使用
timeout 12h COMMAND [ARG]...
您可以简单地编写另一个计时器,安排在您想要的关闭时间运行。他们可以运行一项服务,通过在称为关闭计时器的服务文件中运行
ExecStart=/bin/systemctl stop other.service
来停止您想要的服务。
我查看了来自
JobTimeoutSec
的 man systemd.unit
的文档,但似乎不是适合这项工作的工具。
在一段时间后可以终止 systemd 服务。
使用
RuntimeMaxSec
选项获取 Type=simple
服务:
[Unit]
Description=Terminate simple Service Test
[Service]
Type=simple
RuntimeMaxSec=5
ExecStart=/bin/sleep 10
使用
TimeoutStartSec
获得 Type=oneshot
服务:
[Unit]
Description=Terminate oneshot Service Test
[Service]
Type=oneshot
TimeoutStartSec=5
ExecStart=/bin/sleep 10
这两项服务都会在睡眠计时器达到 10 秒之前的 5 秒后终止。
有关
RuntimeMaxSec
和 TimeoutStartSec
的详细信息可以在这里找到:
https://www.freedesktop.org/software/systemd/man/systemd.service.html
使用 RuntimeMaxSec 可能会导致服务无法在正确的时间停止。例如,如果您想在特定时间(上午 8 点)启动服务,有一天由于出现故障,您必须手动启动服务。在这种情况下,服务将不会在您期望的时间完成,它将在 timestart+RuntimeMaxSec 完成。
要解决此问题,您可以使用参数 Conflicts=test.service:
创建另一个服务[Unit]
Description=Stop Test service
Conflicts=test.service
[Service]
Type=simple
ExecStart=/bin/bash -c 'echo "stopping test service"'
WorkingDirectory=/root
StandardOutput=inherit
StandardError=inherit
Restart=on-failure
RestartSec=10
User=root
并包含一个计时器,用于在特定时间执行停止服务:
[Unit]
Description=Run stop test service
[Timer]
# Run every day at 23:55h
OnCalendar=Mon..Sun 23:55
[Install]
WantedBy=timers.target
因为服务stop与服务test有冲突,如果后者正在运行,前者会停止后者。