我正在使用CoreOS和SystemD计时器来运行我的报告。。。
我有一些监控报告,需要在接下来的12小时内每3小时运行一次,每半小时运行。如果我想在1230醒来以停止报告,那么实现起来非常简单。
systemd-timers>
我相信您可以将以下内容添加到服务文件的[Unit]指令中:
JobTimeoutSec=43200
您可能只需要编写一个包装脚本来在12小时后终止进程,或者使用timeout 12h COMMAND [ARG]...
您只需编写另一个定时器,该定时器计划在您想要的关闭时间运行。他们可以通过在名为关闭计时器的服务文件中运行ExecStart=/bin/systemctl stop other.service
来运行一个停止您想要停止的服务。
我查看了man systemd.unit
中JobTimeoutSec
的文档,似乎不是适合该工作的工具。
在一定时间后可以终止systemd服务。
对Type=simple
服务使用RuntimeMaxSec
选项:
[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冲突,如果后者正在运行,则前者将停止后者。