Uruchamiaj skrypt raz dziennie z systemd

13

Chcę uruchomić skrypt tworzenia kopii zapasowych 10 minut po uruchomieniu komputera, ale tylko raz dziennie. Czy możliwe jest budowanie takich scenariuszy za pomocą systemd?

Fu86
źródło
3
Nie do końca rozumiem twoje wymagania, proszę wyjaśnij. Rozumiem, że jeśli zrestartujesz serwer kilka razy dziennie, skrypt powinien zostać uruchomiony dopiero po pierwszym uruchomieniu, prawda? Jeśli Twój komputer działa dłużej niż 1 dzień, czy skrypt powinien być uruchamiany w kolejnych dniach?
Krzysztof Adamski,
Dokładnie. Zrobię kopię zapasową każdego dnia, bez względu na to, jak często uruchamiam ponownie komputer.
Fu86
5
Jeśli nie rozłączasz się z systememd, to właśnie po to jest anakron.
Gilles „SO- przestań być zły”
Mogę się mylić, ale nie ma łatwego sposobu na ustawienie skryptu anacron, aby uruchamiał skrypt zaledwie 10 minut po zakończeniu rozruchu.
Krzysztof Adamski,
Zgadza się. Właśnie dlatego obecnie używam anakronu i starego dobrego w codziennej pracyecho "obnam backup" | at "now + 10 minutes"
Adrien Clerc

Odpowiedzi:

11

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

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Spowoduje to uruchomienie odpowiedniego .servicepliku 15 minut po uruchomieniu, a następnie każdego dnia, gdy system jest uruchomiony. Jeśli ponownie uruchomisz komputer wiele razy w tym samym dniu, możesz po prostu sprawić, by skrypt kopii zapasowej sprawdził czas archiwizacji i pominął uruchamianie, jeśli ma mniej niż jeden dzień.

Ponadto, jeśli kopie zapasowe będą obciążone na IO, pomocne może być przeczytanie o dyrektywach IOScheduling * na stronie systemd.exec (5) .

Craig
źródło
5

Nie sądzę, że można to zrobić całkowicie w systemie, ponieważ nie śledzi żadnego stanu między restartami. Możesz łatwo zaplanować uruchomienie programu po 10 minutach od uruchomienia systemd.timeri jego OnBootSec=lub OnStartupSec=.

Sam skrypt musi sprawdzić, czy został już uruchomiony dzisiaj, czy nie. Można to łatwo wdrożyć nawet w bash, na przykład:

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

[[ -z "$LASTRUN" ]] || [[ "$TODAY" -gt "$LASTRUN" ]] || exit
echo $TODAY > $FILE
RUNYOURSCRIPTHERE
Krzysztof Adamski
źródło
1

Jeśli nie rozłączyłeś się po 10 minutach od uruchomienia, możesz:

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=dailysprawia, że ​​działa on o północy, Persisten=truepodczas rozruchu, jeśli było co najmniej jedno pominięte uruchomienie.

x-yuri
źródło
0

Najwyraźniej ten problem zostanie rozwiązany w przyszłych wydaniach. Przynajmniej zgodnie z tym e-mailem na liście mailingowej systemd-devel. Do tego czasu musisz iść chwiejną drogą Krzysztof zaproponował.

mmh
źródło