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


13

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


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) .


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. До этого ты должен идти по хакерскому пути, предложенному Кшиштофом.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.