[ OE 2.2 en OE 2.5] Geen cronjobs meer, maar Systemd-Timer als Cron-Alternatief

eendenteam

Addicted Member
Administrator
Moderator
Lid sinds
1 feb 2004
Berichten
6.246
Waarderingsscore
41
Punten
48
Leeftijd
121
Indien systemd is ge?nstalleerd, kun je de timer functie hiervan gebruiken in plaats van een cron opdracht.
We proberen uit te leggen, hoe dit in zijn werk gaat.

Je kunt met

Code:
systemctl list-timers

bekijken welke systemd timers er op je systeem zijn. Vergeet niet aan het einde op CTRL+C te drukken, om weer bij de command prompt te komen.

Je hebt 2 bestanden nodig, welke je zelf moet maken. We hebben in dit voorbeeld als bestandsNAAM gekozen voor: test. Dit kun je natuurlijk zelf veranderen.

1. test.timer
2. test.service


Wil je een script uitvoeren dan heb je een 3e bestand nodig, bijv met de volgende naam:
3. mijnscript.sh

De bestandsnaam van nummers 1 en 2 moet hetzelfde zijn !
Bestanden nummers 1 en 2 moeten worden geplaatst in  de map "/lib/systemd/system"
Bestand nummer 3 is een bin/sh bestand, kan overal worden geplaatst, kan elke naam hebben en moet uitvoerbaar zijn (chmod 755), deze moet dan worden aangeroepen door bestand nummer 2 (wel de juiste naam van het script in bestand nummer 2 opgeven)

Bestand nummer 1 is een .timer bestand en is een makkelijk te begrijpen tekstbestand
Bestand nummer 1 bevat informatie over de tijd wanneer de timer moet worden uitgevoerd: dit kan dus ook het tijdstip voor het aanroepen van een script (bestand 3) zijn.
Voor het dagelijks uitvoeren van een opdracht, ziet bestand nummer 1 er bijv. zo uit:

Code:
[Unit]
Description=timer 1x dagelijks

[Timer]
OnBootSec=1h
OnUnitInactiveSec=1d

[Install]
WantedBy=basic.target

OnBootSec=1h zorgt er voor dat het 1 uur na een nieuwe start van de pc voor het eerst wordt uitgevoerd.

OnUnitInactiveSec=1d betekent dat het 24 uren na afloop van de vorige keer het opnieuw moet worden gestart. Indien er achter de tijd geen eenheid volgt (in het voorbeeld staat er "1d"; de "d" is de eenheid voor dag (day)),worden deze beschouwd als seconden.
De syntaxis van de tijdseenheden is in "man systemd.time" beschreven. Je kunt bijv. nemen: 2h 15min of 3weeks of 6months.

Je kunt ook iets dagelijks laten uitvoeren om bijv. 06.02 uur. Je moet dan in bestand 1 het gedeelte onder "[Timer]" aanpassen:

Code:
[Unit]
Description=timer dagelijks om 06.02 uur

[Timer]
OnCalendar=6:02
Persistent=true

[Install]
WantedBy=basic.target

Zoals je ziet, wordt gebruikt gemaakt van "Persistent=true", dat er voor zorgt dat - indien om wat voor reden ook het script niet om 06.02 is uitgevoerd - het na een herstart van de pc alsnog wordt uitgevoerd.
Indien je absolute tijden wilt gebruiken, dan kan dat via systemd maar dat is een complexe syntaxis. Dit is in "man systemd.time" onder "Calender Events" beschreven.
Zo zorgt "OnCalendar=Sun 2018-*-* 00:03" er voor dat op elke zondag in 2018 om 00:03 uur het wordt uitgevoerd.

Zoals vermeld moeten bestanden nummer 1 en 2 dezelfde naam hebben, deze zijn aan elkaar gelieerd. Bestand nummer 1 hebben we hierboven behandeld.
Voor het uitvoeren

Een eenvoudig bij bestand nummer 1 behorend .service bestand - dat een script opstart - is:

Code:
[Unit]
Description=uitvoeren van mijnscript.sh

[Service]
ExecStart=/usr/script/mijnscript.sh

Uiteraard moet het bestand mijnscript.sh dan in de map /usr/script staan en uitvoerbaar zijn.

Een systemd timer start je via de command prompt met (in dit geval) het commando: systemctl start test.timer
Uiteraard wil je zo'n systemd timer automatisch laten starten na een reboot.
Dan moet je via de command prompt (in dit geval) dit commando ingeven: systemctl enable test.timer
Wil je beide in ??n keer doen (dus starten en automatisch starten na een reboot) gebruik dan dit commando: systemctl enable --now test.timer

Zo hebben wij een autoupdate timer gemaakt dat elke dag om 06.00 uur wordt uitgevoerd en zorgt er voor dat een firmware update wordt uitgevoerd op onze dreambox. Gebruik wordt dan gemaakt van autoupdate.service, autoupdate.timer en autoupdate.sh

Deze 3 bestanden kun je hier downloaden en op eigen risico uitvoeren.

Er wordt in de map /AutoUpdate (wordt autom. aangemaakt) een logbestand aangemaakt, zodat je na kunt kijken of er een update is uitgevoerd.
Er worden standaard maximaal 5 logbestanden bewaard (zijn er meer dan 5, dan worden de oudste bestanden verwijderd).
Dit aantal van 5 kun je zelf in autoupdate.sh veranderen door boven in het bestand "MAXFILES=5" aan te passen.

Deze timer roept het script "autoupdate.sh" aan, dat de updates uitvoert.
Het bestand autoupdate.sh moet in de map "/usr/script" staan (dit kun je zelf aanpassen); denk aan chmod 755
De bestanden "autoupdate.service" en "autoupdate.timer" moeten in de map "/lib/systemd/system" staan
Niet vergeten via de command prompt dit commando ??n keer in te geven: systemctl enable --now autoupdate.timer
Controleer of de timer actief is met het commando: systemctl list-timers

Inmiddels hebben we autopupdate.sh zo aangepast dat indien de plugin dBackup of de plugin Barry Allen is ge?nstalleerd en voordat er wordt geupdate eerst een backup wordt gemaakt. Ook kun je alleen een backup maken - indien een van de hier voor genoemde plugins is ge?nstalleerd - met de parameter -f of -F, dus bijv.

Code:
/usr/script/autoupdate.sh -f

Volledigheidshalve hier de beide systemd autoupdate bestanden:

/lib/systemd/system/autoupdate.service:

Code:
[Unit]
Description=automatic update firmware

[Service]
Type=oneshot
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
Environment="ABRT_IGNORE_PYTHON=1"
ExecStart=/usr/script/myscripts/autoupdate.sh


/lib/systemd/system/autoupdate.timer:

Code:
[Unit]
Description=timer for autoupdate firmware

[Timer]
OnCalendar=06:00
Persistent=true

[Install]
WantedBy=basic.target


Activeren autoupdate timer:
- kopieer autoupdate.service en autoupdate.timer naar de map /lib/systemd/system
- maak de map /usr/script aan
- kopieer autoupdate.sh naar de map /usr/script
- geef het commando: chmod 755 /usr/script/autoupdate.sh
- activeer de systemd timer door dit commando: systemctl enable --now autoupdate.timer
- controleer evt. door dit commando: systemctl list-timers
 
v3.7:
- fout verholpen dat met Barry Allen er soms geen backup werd gemaakt

v3.6:
- lock bestand toegevoegd ter voorkoming dat script meerdere keren tegelijk kan worden opgestart
- melding Eendenteam en versie nummer bij start van script toegevoegd

v3.5:
- via parameter -f (of -F) kun je script nu all??n backup laten maken (forced backup), dus: autoupdate -f
- backup wordt nu ook gemaakt als de plugin dbackup is geinstalleerd
- herkenning van image (experimental of release) en toevoeging daarvan in backup naam
- broncode opgeoptimaliseerd

v3.4:
- verbetringen

v3.3:
- bug fixed

v3.2:
- indien DreamOS is ge?nstalleerd (dus Enigma2 vanaf v4.2 en dus met apt-get (i.p.v. opkg)), dan wordt script be?indigd indien er g??n update van de huidige image beschikbaar is; er wordt dan dus geen backup gemaakt
- linux/ubuntu items verwijderd uit script

v.3.0:
- als Barry Allen is ge?nstalleerd, wordt eerst een backup van de huidige image gemaakt (alleen indien het jaartal in de bootimage naam aanwezig is)
- iets meer output in autoupdate.log bestand
- optimalisering broncode
 



Hosting Fun

Advertenties

Terug
Bovenaan Onderaan