我遇到了一个问题,我设置了一堆 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.timer
。sudo 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
# 但是服务没有