Запускать скрипт один раз в день с помощью systemd

13

Я хочу запускать скрипт резервного копирования через 10 минут после загрузки компьютера, но только один раз в день. Можно ли создать такие сценарии с помощью systemd?

Fu86
источник
3
Я не полностью понимаю ваши требования, пожалуйста, уточните. Я понимаю, что если вы перезагружаете свою машину несколько раз в день, скрипт должен запускаться только после первой перезагрузки, верно? Если ваша машина работает более 1 дня, должен ли скрипт запускаться последовательно?
Кшиштоф Адамски
Точно. Я буду делать резервную копию каждый день, независимо от того, как часто я перезагружаю свой компьютер.
Fu86
5
Если вы не зациклены на systemd, это именно то, для чего нужен анакрон.
Жиль "ТАК - перестань быть злым"
Я могу ошибаться, но нет простого способа настроить anacron для запуска скрипта только через 10 минут после завершения загрузки.
Кшиштоф Адамски
Это верно. Вот почему я в настоящее время использую анакрон и старое доброе в повседневной работе, такой какecho "obnam backup" | at "now + 10 minutes"
Adrien Clerc

Ответы:

10

Смотрите /lib/systemd/system/systemd-tmpfiles-clean.timer:

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Соответствующий .serviceфайл запускается через 15 минут после загрузки, а затем каждый день, пока система работает. Если вы перезагружаетесь несколько раз в один и тот же день, вы можете просто сделать так, чтобы скрипт резервного копирования проверил mtime архива и пропустил его, если он меньше суток.

Также, если ваши резервные копии будут тяжелыми при вводе-выводе , может быть полезно прочитать о директивах IOScheduling * на man-странице systemd.exec (5) .

Craig
источник
5

Я не думаю, что это возможно сделать полностью в systemd, так как он не отслеживает состояние между перезагрузками. Вы можете легко запланировать запуск чего-либо через 10 минут после загрузки и использования systemd.timerее OnBootSec=или 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. До этого ты должен идти по хакерскому пути, предложенному Кшиштофом.

ММХ
источник