如何正确安装 systemd 计时器和服务?

jwo*_*der 32 systemd

我正在尝试在 Bionic 上创建和安装一对自定义的 systemd 计时器和服务单元,用于定期运行命令。我知道应该将文件放入/etc/systemd/system然后我应该运行systemctl daemon-reload,但是我不清楚是否需要启用或启动任何东西才能完全安装和“运行”计时器,以及我可以的几篇文章发现地址这一点都给出了不同的信息。

我的.timer文件是:

[Unit]
Description=Run custom command periodically

[Timer]
Unit=my-custom-command.service
OnCalendar=*-*-* 0/8:00:00

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

我的.service文件是:

[Unit]
Description=Run a custom command
OnFailure=mail-systemd-failure@%n.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/custom-command
User=dedicated-user
Group=dedicated-user
Run Code Online (Sandbox Code Playgroud)

我读过的相互矛盾的文章是:

那么我是否启用和/或启动计时器(或其服务?),两者之间究竟有什么区别?根据单元文件是新安装还是在编辑后重新加载,我需要运行的命令是否会发生变化?

Per*_*uck 48

要在指定的时间或间隔运行一个单元,您需要两个单元:

  • 定义要运行什么服务单元
  • 定义何时运行服务单元计时器单元

按照惯例,定时器单元启动另一个具有相同名称的单元,即foo.timer开始foo.service。您可以通过Unit=other.service在计时器单元中定义属性来覆盖它(就像您所做的那样)。

如果两个单元文件都被创建并放入,/etc/systemd/system你需要systemd通过发出

systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

这使得systemd重新加载所有单元文件并重新考虑它们的依赖关系,因为以某种方式systemd 缓存这些文件。因此,无论何时更改单元文件,都需要此命令。

之后,你需要启用定时器单元

systemctl enable foo.timer
Run Code Online (Sandbox Code Playgroud)

此命令仅在启动时启用自动启动(但尚未启动设备)。不要启用服务单元,因为这将意味着启动服务在系统启动时(独立于任何计时器设置)。

现在下次启动时,计时器将启动。要立即启动它(无需启动),您将运行

systemctl start foo.timer
Run Code Online (Sandbox Code Playgroud)

从现在开始,只要时间到了,定时器单元就会启动服务单元。您可以将启用开始

systemctl enable --now foo.timer
Run Code Online (Sandbox Code Playgroud)

您可以(并且应该)不理会服务单元,即既不启用也不启动它。这现在由计时器单元处理。

要查看计时器和服务的当前状态,请发出

systemctl status foo.timer foo.service
Run Code Online (Sandbox Code Playgroud)

总结一下

  • systemctl enable/disable 控制启动时的行为
  • systemctl start/stop 立即控制行为
  • enable没有暗示start(同样没有disable暗示stop)。这可以用--now开关覆盖。
  • 只有enablestart定时器单元,而不是服务单元
  • 发出systemctl daemon-reload每次修改单元文件

进一步阅读:

  • - 现在我明白了。 (3认同)