在特定时间启动/停止 systemd.service

Jam*_*son 25 scheduling systemd

我想在特定时间启动和停止 systemd.service。据推测,我将使用 .timer 单元来启动作业,但是是否有内置的方法可以在特定持续时间后或特定时间停止作业,或者我是否必须创建第二个 .timer 单元来执行stop

谢谢

Joh*_*oon 13

您可以使用几个 cron 作业:

#???????????????分钟 (0 - 59)
 # ? ??????????????? 小时 (0 - 23)
 # ? ? ?????????????????? 每月的第几天 (1 - 31)
 # ? ? ? ????????????????????? 月 (1 - 12)
 # ? ? ? ? ?????????????????? 星期几 (0 - 6)
 # ? ? ? ? ?
 # ? ? ? ? ?
   * * * * * systemctl start $SERVICE.service
   * * * * * systemctl stop $SERVICE.service

有关 cron 的更多信息:https://en.wikipedia.org/wiki/Cronhttps://wiki.archlinux.org/index.php/Cron

  • cron 作业如何改进 OP 已经知道的 systemd `.timer` 单元? (12认同)
  • @JamieKitson 老实说,我认为除了 cron 和 systemd 计时器之外,实际上*不需要*有这样的功能。大多数 systemd 安装永远不会使用这些功能,使用 cron、systemd 计时器和任何你喜欢的东西运行 `systemctl` 没有错。在我看来,这个答案与任何其他答案一样有效。 (2认同)

小智 12

要使用计时器停止服务 A,您可以创建一个oneshot将与它发生冲突的类型的服务 B ,然后使用计时器启动服务 B。

如果一个单元在另一个单元上有一个 Conflicts= 设置,启动前者将停止后者,反之亦然。(来源

A.服务:

[Unit]
Conflicts=B.service
...
Run Code Online (Sandbox Code Playgroud)

B.服务:

[Unit]
Description=B service description

[Service]
Type=oneshot
ExecStart=/bin/echo ''
Run Code Online (Sandbox Code Playgroud)

B.定时器:

[Timer]
AccuracySec=1
OnActiveSec=10

[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)

以下将在 10 秒后停止服务 A。

systemctl start A.service
systemctl start B.timer
Run Code Online (Sandbox Code Playgroud)


Pav*_*rda 8

确实有另一种方法可以在.service文件中配置某些运行时后停止服务。

RuntimeMaxSec=...
Run Code Online (Sandbox Code Playgroud)

您可能不喜欢服务被视为失败的事实,但这是杀死长期运行的服务或多或少的合乎逻辑的结果。

为了获得更好的答案,您可能需要解释使用这种不寻常功能的理由。服务通常意味着永远运行或直到它们被明确停止,而不仅仅是固定的时间。

  • 常见的。当服务器获得最少的流量时,仅在夜间运行资源需求型服务(可能是 SETI)怎么样?此外,在我工作的地方,我们有一个警报守护程序,旨在在服务器出现异常时通过他们的电话唤醒支持团队。我们真的不希望在我们真正醒着的时候运行那些烦人的东西,因为这些服务器在高峰使用期间左右都有问题。 (4认同)
  • 是的,我们在邮件列表中讨论了这个及其限制:https://lists.freedesktop.org/archives/systemd-devel/2016-April/036362.html (2认同)