我正在尝试在 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.timer
starts 。您可以通过在计时器单元中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 覆盖此设置。disable
stop
--now
- 仅限定时器
enable
单元start
,不包括服务单元 systemctl daemon-reload
每当您编辑单元文件时都会出现问题
进一步阅读: