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

如何正确安装 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

我的.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

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

  • 本文说要运行:

    systemctl daemon-reload
    systemctl enable $NAME.timer
    systemctl start $NAME
    

    据我了解,后一个命令与相同systemctl start $NAME.service,我希望立即运行服务定义的命令,但这不是我想要做的。

  • 这个要点说只需运行:

    systemctl daemon-reload
    systemctl start $NAME.timer
    
  • 本文说要运行:

    systemctl enable $NAME.timer
    systemctl start $NAME.timer
    

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

答案1

要按指定时间或间隔运行设备,您需要单位:

  • A服务单位定义什么跑步
  • A定时器单元定义什么时候运行服务单位

按照惯例,计时器单元会启动另一个同名的单元,即foo.timerstarts 。您可以通过在计时器单元中foo.service定义属性来覆盖此功能(就像您所做的那样)。Unit=other.service

如果两个单元文件都已创建并放入,/etc/systemd/system则需要systemd通过发出以下命令来了解它们

systemctl daemon-reload

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

之后你需要使能够定时器单元

systemctl enable foo.timer

此命令仅启用引导时自动启动(但尚未启动设备)。请执行不是启用服务单元,因为这意味着启动服务在启动时(独立于任何计时器设置)。

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

systemctl start foo.timer

从现在起,定时器单元将在时间到时启动服务单元。你可以组合启用开始

systemctl enable --now foo.timer

你可以(也应该)不要管服务单元,也就是说使能够也不开始它。现在由计时器单元来处理。

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

systemctl status foo.timer foo.service

总结

  • systemctl enable/disable控制启动时的行为
  • systemctl start/stop现在控制行为
  • enable不是imply ( implystart也不包含)。可以使用 switch 覆盖此设置。disablestop--now
  • 仅限定时器enable单元start,不包括服务单元
  • systemctl daemon-reload每当您编辑单元文件时都会出现问题

进一步阅读:

相关内容