使用 systemd 每天运行一次脚本

使用 systemd 每天运行一次脚本

我想在启动计算机 10 分钟后运行备份脚本,但每天只运行一次。是否可以使用 systemd 构建这样的场景?

答案1

看:/lib/systemd/system/systemd-tmpfiles-clean.timer

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

这会.service在启动后 15 分钟运行相应的文件,然后每天在系统启动时运行相应的文件。如果您在同一天多次重新启动,则可以让备份脚本检查存档的运行时间,并在运行时间少于一天时跳过该运行。

另外,如果您的备份需要大量 IO,那么阅读以下内容可能会有所帮助:IOS调度*中的指令系统执行(5)联机帮助页。

答案2

我认为不可能完全在 systemd 中完成此操作,因为它不会跟踪重新启动之间的任何状态。您可以使用systemd.timer和 itOnBootSec=或轻松安排某些内容在启动后 10 分钟运行OnStartupSec=

脚本本身必须检查它今天是否已经运行。即使在 bash 中也可以轻松实现,例如:

#/bin/sh -x
FILE=/etc/lastrun
TODAY=`date +"%Y%m%d"`
LASTRUN=`cat $FILE`

[[ -z "$LASTRUN" ]] || [[ "$TODAY" -gt "$LASTRUN" ]] || exit
echo $TODAY > $FILE
RUNYOURSCRIPTHERE

答案3

如果启动后 10 分钟没有挂断,您可以:

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=daily让它在每个午夜运行,Persistent=true如果至少有一次错过运行,则在启动时运行。

答案4

显然这个问题将在未来的版本中得到解决。至少根据systemd-devel 邮件列表上的电子邮件。在那之前,你必须采用克日什托夫提议的黑客方式。

相关内容