Systemd 定时器混乱

Systemd 定时器混乱

我有一个通过 Systemd 运行的程序,我试图弄清楚如何在特定时间启动/停止它。这是一个持久的程序(传输)。

目前我有一个包含以下几行的 crontab:

0 8 * * * systemctl stop transmission-daemon
0 20 * * * systemctl start transmission-daemon

我正在努力将其转换为 Systemd 计时器文件。

此外,是否可以让 systemd(或 cron)在重新启动时根据当前时间检查服务是否应该运行?

感谢您的帮助,如果以前有人问过这个问题,请给我指出此类事情的具体例子。我能找到的大部分内容是如何以 15 分钟的间隔运行服务以及类似的内容。

答案1

使用一个计时器每小时运行一次脚本并在重新启动时运行一次脚本可能会更简单,并且该脚本检查当前时间是否是守护进程应该运行的时间,然后在必要时(可能在检查后systemctl is-active $service)启动或停止服务。该脚本还可以检查文件,或作用于其他业务逻辑来确定是否需要运行某些东西,例如文件touch ~/.fooservice-do-not-run可以禁用某些东西,或者负载是否太高等。

答案2

要通过 systemd 中的计时器启动服务,您需要使用两个单元文件。十、服务文件来描述实际的服务,以及X.定时器文件来描述服务何时启动。

要按照您所描述的方式打开和关闭服务,我能想到的最好的办法就是拥有一个单独的服务克奥夫一对单元文件,其中服务文件相互冲突。这克奥夫服务实际上并没有做任何事情,它只是在真正的服务关闭时“运行”。

为了给您一个想法,这里有一个带有服务的玩具示例睡觉每偶数分钟打开一次,每奇数分钟关闭一次。

睡眠.服务:

[Unit]
Description=Test service not doing anything real.
Conflicts=sleepoff.service

[Service]
ExecStart=/usr/bin/sleep 1d

睡眠定时器:

[Unit]
Description=Timer to start the sleep service.

[Timer]
OnCalendar=*:0/2

睡眠服务:

[Unit]
Description=Dummy service "running" when the real unit is off.
Conflicts=sleep.service

[Service]
Type=oneshot
ExecStart=/usr/bin/true
RemainAfterExit=true

睡眠定时器:

[Unit]
Description=Timer to stop the sleep service.

[Timer]
OnCalendar=*:1/2

相关内容