使用systemd每天运行一次脚本


13

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


3
我不完全了解您的要求,请澄清。我了解,如果您在一天内重新引导计算机,那么该脚本应仅在第一次重新引导后运行,对吗?如果您的计算机运行超过1天,该脚本是否应该连续运行几天?
Krzysztof Adamski 2012年

究竟。无论我多长时间重启一次PC,我都会每天进行备份。
2013年

5
如果您不习惯systemd,这正是anacron的用途。
吉尔斯(Gillles)“所以别再作恶了”

我可能是错的,但是没有一种简单的方法可以将anacron设置为在启动完成后仅10分钟运行脚本。
Krzysztof Adamski 2012年

那就对了。这就是为什么我目前正在使用anacron和年纪大的人,每天做这样的工作echo "obnam backup" | at "now + 10 minutes"
Adrien Clerc

Answers:


10

请参阅/lib/systemd/system/systemd-tmpfiles-clean.timer

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

这将.service在启动后15分钟运行相应的文件,然后在系统启动时每天运行。如果您在同一天多次重新启动,则只需让备份脚本检查存档的mtime即可,如果不到一天,则跳过该运行。

另外,如果您的备份将占用大量IO,则在systemd.exec(5)联机帮助页中阅读IOScheduling *指令可能会有所帮助。


5

我认为不可能在systemd中完全执行此操作,因为它在重新启动之间不会跟踪任何状态。您可以使用systemd.timerOnBootSec=或轻松地安排一些东西在启动后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

1

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

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=daily使它每隔午夜运行一次,Persisten=true如果至少错过了一次,则在引导时运行。


0

显然,此问题将在将来的版本中解决。至少根据systemd-devel邮件列表上的电子邮件。在此之前,您必须采用Krzysztof提出的骇人听闻的方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.