让 systemd 计时器*不*在启动时运行,只按计划运行

让 systemd 计时器*不*在启动时运行,只按计划运行

我遇到了一个问题,我设置了一堆 systemd 计时器按计划运行以执行各种备份相关任务。它们在指定的时间成功运行。然而它们在系统启动时运行,我想避免这种情况。例如,我有一个远程 rsync,需要几个小时才能完成,它只需要在晚上运行一次,而不是在重新启动时运行。

这是一个示例计时器:

[Unit]
Description=Run Remote rsync
Requires=remote-backup.service

[Timer]
OnCalendar=*-*-* 4:00:00
RandomizedDelaySec=1h
Persistent=false

[Install]
WantedBy=timers.target

这是它运行的服务:

[Unit]
Description=Remote backup
After=zfs.target network-online.target
OnFailure=status-email-root@%n.service

[Service]
Type=oneshot
ExecStartPre=/path/to/pre-backup script
ExecStart=/path/to/backup-script
ExecStartPost=/path/to/post-backup script

(备份前和备份后脚本 ping 健康检查 URL 以便我收到成功/失败/等的报告)

问题是它应该只在凌晨 4 点运行,但如果我重新启动,它将尝试在启动时运行。我尝试将其更改Persistent为 false,但没有效果。我想将其保留为 true,因为如果备份真的失败或没有运行,我想重新运行它,但不是每次都运行它!

我也尝试过删除,WantedBy但这只是让它无法运行,我也尝试过更改Type服务,但是没有成功。

如果有人有任何见解,我将不胜感激。谢谢!

答案1

如果其他人遇到同样的问题,reddit 上的 /u/stormcloud-9能够帮助我解决这个问题。结果我需要删除计时器单元中的“Requires”行。我没有意识到的是,除非使用 Unit= 指令覆盖,否则 systemd 计时器会自动绑定到具有相同文件名的服务器(例如 XXX.timer 会自动调用 XXX.service)。

每次系统启动并且计时器启动时,它都会因为 Requires= 行而不必要地启动该服务。

答案2

经过半天的苦苦思索,我找到了一个简单的方法我在这个帖子中详细介绍了。提供的许多部分解决方案可能有用,但对我来说没用。

快速版本。在 /etc/systemd/system/ 中创建两个具有相同基本名称的简单文件,此处为 test,但后缀为 .service 和 .timer。不要添加额外的要求和通缉。

这些是 test.service 和 test.timer。

[Unit]
Description=This is test.service

[Service]
Type=oneshot
ExecStart=/bin/echo "**** I ran at this now ****"

[Unit]
Description=This is test.timer

[Timer]
OnCalendar=*-*-* 10:45:00

[Install]
WantedBy=timers.target

创建文件然后运行sudo systemctl enable test.timersudo systemctl start test.timer然后重新启动系统。

您可以为 .timer 和 .service 运行下面的 status 和 journalctl 命令,以确认它们是否按预期运行。

其他有用的命令:

systemctl list-unit-files --state=enabled # whats live
systemctl list-timers # 现在应该包括你的
systemctl status test.timer # 检查计时器是否已启用 systemctl status test.service # 并且服务没有
sudo journalctl -u test.timer # 检查计时器是否在启动时运行
sudo journalctl -u test.service # 但是服务没有

https://man.archlinux.org/man/systemd.time.7# 时间格式

相关内容