systeemd

Volgende generatie Cron met systemd Een timer maken Tim

Volgende generatie Cron met systemd Een timer maken Tim
Moet u in de toekomst een taak op uw computer plannen?? Dit lijkt misschien eenvoudig - uw vaatwasser kan immers wachten voordat hij wordt gestart met behulp van een knop - maar soms maken computers zulke eenvoudige taken zo hard.Maar als je wat achtergrond hebt, heb je waarschijnlijk wel eens van gehoord cron, dit stukje software volledig toegewijd om de juiste taak op het juiste moment te starten. Maar deze tool is echt ontworpen met eenvoud in gedachten en je kunt uiteindelijk voor onaangename verrassingen komen te staan.Als het je ooit gelukt is om een ​​taak in Windows te plannen, heb je de Windows Taakplanner gebruikt. Het heeft standaard een GUI, maar het maakt het ook niet zo eenvoudig te gebruiken: deze twee systemen starten gewoon een proces op een vaste tijd en datum.

Om te begrijpen hoe systemd je daar kan helpen, zal ik een voorbeeld nemen.

Welke valkuilen systemd timers je zullen vermijden??

Als u ooit een machine bezit met gegevens die u belangrijk vindt, wilt u een kopie van uw gegevens op een andere, waarschijnlijk veiligere plaats hebben. Als u een server beheert, is het verplicht: hoe herstelt u immers als uw harde schijf uitvalt en voorkomt u dat u gegevens kunt herstellen?

Dus als verantwoordelijke stel je elke week of elke dag een back-up in. U kunt het instellen met cron, u plant het om 04:24 uur, maar hier begint het probleem: wat als uw server om welke reden dan ook wordt afgesloten van 04:10 uur tot 04:30 uur?

Nou, het is waarschijnlijk dat cron die back-up gewoon overslaat. Dit kan van cruciaal belang zijn als dat vaak en stil gebeurt of als uw code afhankelijk is van het feit dat deze wordt uitgevoerd en anders kan mislukken. Over het algemeen gebeurt dit wanneer u een opschoningstaak instelt via cron en deze niet start. Plots heeft uw code mogelijk onvoldoende ruimte om door te gaan en zal deze breken - het is triest, zo trieste situatie, toch meneer Elton John.

Als een gemiste lancering echter een probleem kan zijn, stel je dan een seconde voor - wauw, John Lennon nu? - dat je taak te traag is. Als je taak is ingesteld om elke 10 minuten te worden uitgevoerd, maar 15 minuten duurt om te voltooien, zal cron of Windows graag een andere taak starten, zelfs als de huidige taak nog niet is voltooid - en dus heb je 2 instanties van je taak die tegelijkertijd worden uitgevoerd , welke is de perfect recept voor ramp. Wanneer een programma gelijktijdig wordt uitgevoerd terwijl het niet is ontworpen om dit te doen, zal het waarschijnlijk bestanden, andere software, databases beschadigen - en je server wordt plotseling een zinkend schip zoals Titanic.

OK, misschien ga ik te ver met Titanic, maar je snapt het idee. Hoewel systemd niet veel had kunnen doen om dit schip te redden, kan het je helpen met al deze tekortkomingen en ervoor zorgen dat je een langere kerstvakantie hebt dankzij de bugs die het je zal vermijden. Het is nu tijd om te leren hoe u systemd-timers instelt.

Automatische serverback-up plannen?

Allereerst activeren systemd-timers een systemd-service, dus voordat u uw taak plant, moet u er eerst een service van maken. Gelukkig heb ik een handleiding geschreven om systemd-service te maken, op deze manier zal het je kennis laten maken met de manier van werken van systemd. Je moet het lezen voordat je verder gaat. Tenzij als je precies weet wat u doet, uw systemd-servicebestand zou moeten niet elke WantedBy= instelling bevatten. Als u uw service op een specifiek tijdstip wilt starten, wilt u deze waarschijnlijk niet bij het opstarten starten.

Dankzij het systemd-servicesysteem is het onmogelijk om meerdere exemplaren van uw taak per ongeluk te laten uitvoeren: als een taak al actief is, slaat deze de lancering gewoon over en laat de huidige taak zijn werk afmaken.

Zodra u een systemd-service hebt om te plannen, maakt u een bestand met dezelfde bestandsnaam als uw service, behalve dat het moet eindigen met end .timer in plaats van .onderhoud. In ons voorbeeld van een automatische back-up zou de service een automatische back-up zijn.service en de timer zou een automatische back-up zijn.tijdopnemer. Beide bestanden moeten in dezelfde map staan. Zoals ik je vertelde in het systemd-serviceartikel, raad ik je aan om deze bestanden op een normale plaats te schrijven, zoals je homedirectory, en ze vervolgens naar een systemd-map te kopiëren zodra je klaar bent met je bewerkingen.

Dus, laat me je laten zien hoe ons timerbestand eruit ziet:

[Eenheid]
Description=Plan back-ups tijdens daluren
[Timer]
OpKalender=*-*-* 03:00:00
RandomizedDelaySec=7200
Aanhoudend = waar
[Installeren]
WantedBy=timers.doelwit

Net als in systemd-services, zijn er 3 secties. [Eenheid] of [Installeren] werken precies hetzelfde als uitgelegd in mijn artikel over systemd-services. Houd er rekening mee dat WantedBy= hier belangrijk is omdat timers kunnen worden gestart of gestopt, dus als u systemd niet vertelt om uw timer te starten tijdens het opstarten, wordt deze nooit geactiveerd. timers.doel is een speciaal systeemdoel voor timers.

Nu, het gedeelte [Timer]. Daarin vind je alle instellingen met betrekking tot wanneer de timer moet worden geactiveerd. Voor onze geautomatiseerde back-up heb ik systemd verteld om het uit te voeren tussen 03:00 en 05:00 in de tijdzone van de server. De exacte tijd is willekeurig op elke dag.

OnCalendar= stelt de timer in met betrekking tot de tijd van uw server (wandklok), zoals elke zondag om 13:00 uur. Als je cron eerder hebt gebruikt, zou je echt bekend moeten zijn met deze syntaxis. Het heeft echter enkele extra voordelen.

Als u bijvoorbeeld wilt dat er elk uur iets gebeurt, kunt u dit als volgt doen:

OnCalendar=per uur

en dagelijks:

OnCalendar=dagelijks

In feite ondersteunt het alle volgende waarden:

  1. minutieus
  2. elk uur
  3. dagelijks
  4. maandelijks
  5. wekelijks
  6. jaarlijks
  7. per kwartaal
  8. halfjaarlijks

Er is echter een probleem met deze zoekwoorden: dagelijkse triggers worden bijvoorbeeld altijd om middernacht geactiveerd, wat vaak een piekuur is in computersystemen. Daarom wordt het aanbevolen om RandomizedDelaySec= te gebruiken (het gebruik ervan wordt hieronder gespecificeerd). Hoe dan ook voor back-up is het geen goede optie: middernacht is geen daluren, het is eerder het omgekeerde. We moeten dus nauwkeuriger instellen wanneer we die taak willen zien starten.

Als je meer controle wilt, kun je een datum schrijven zoals 2018-12-06 12:49:37. Nou, als je zo specifiek bent, activeer je de timer maar één keer. Om het terugkerend te maken, vervang je elk van deze elementen door * asterisk.

OpKalender=*-*-* 03:00:00

Zoals je hierboven kunt zien, is in ons back-upvoorbeeld het hele datumgedeelte *-*-*, wat betekent dat het elke dag van elke maand van elk jaar moet voorkomen. Als je nu doet:

OpKalender=*-12-25 03:00:00

Daarna rijdt het elke 25 december om 3 uur 's nachts. Perfecte systemd timer voor de kerstman - zelfs als ik betwijfel of hij er ooit een nodig zal hebben! Dus asterisk voegt herhaling toe waar je het plaatst. Als u het in het jaarveld plaatst, betekent het "elk jaar", enz.

Ten slotte kunt u UTC aan het einde van de regel toevoegen om UTC-tijd te gebruiken in plaats van de lokale tijdzone. Sommige services stellen bijvoorbeeld hun API-quota om middernacht opnieuw in, maar om tijdzonebias te voorkomen, gebruikt het UTC. Dus voor dergelijke taken zou je doen:

OnCalendar=dagelijkse UTC

Laten we nu een ander probleem oplossen: spitsuren. systemd heeft ook een instelling om daartegen te vechten.

RandomizedDelaySec= staat toe om de taak van een willekeurige hoeveelheid tijd uit te stellen. De waarde is het maximale aantal seconden dat de timer zal vertragen. Het is specifiek bedoeld voor dergelijke gevallen. Je herinnert je dat in systemd, dagelijks altijd om middernacht wordt geactiveerd? Welnu, wekelijks triggert altijd om maandag middernacht en jaarlijkse triggers om 1 januari middernacht, een van de ergste pieken in het jaar met overal netwerkstoringen. Dat wil je zeker niet.

Door een vertraging toe te voegen, verwijder je dat probleem: het zal automatisch je taak vertragen op een onbekend tijdstip. Willekeur is hier belangrijk omdat het veel waarschijnlijker is dat het zelfs willekeurig is en een gelijkmatige belasting het mogelijk maakt om uw taken beter te optimaliseren.

Stel dat u uw taken 's ochtends rond 7 uur 's ochtends moet uitvoeren, maar u wilt een kleine vertraging van maximaal 15 minuten toestaan, dan doet u dit als volgt:

RandomizedDelaySec=900

Dat zou genoeg moeten zijn voor vertragingen. Soms zijn zelfs milliseconden vertragingen voldoende om onbedoelde pieken te voorkomen.

Aanhoudend = zorgt voor gemiste timertriggers. Wat als uw server 's nachts wordt afgesloten?? Nou, de back-up zou helemaal nooit worden geactiveerd. Door het in te stellen op waar, kan systemd het in dergelijke gevallen bij de volgende keer opstarten. Op deze manier weet je op de een of andere manier dat de taak van de timer wordt uitgevoerd. Het gebruik ervan is eenvoudig, u hoeft alleen maar dit te doen:

Aanhoudend = waar

Dit heeft echter één nadeel dat toch al moeilijk te vermijden is: wanneer meerdere taken van verschillende timers worden gemist, zullen ze allemaal bij het opstarten worden uitgevoerd en dat opstarten vertragen. Naar mijn mening is dat veel beter dan wanneer het nooit loopt en dat is tenslotte normaal, het meest geschikte moment om de timer te laten lopen is wanneer deze is gepland, daarna zal het waarschijnlijk toch ongepast zijn.

OnBootSec= is de laatste optie die ik je zal laten zien (maar niet de minste). Het is als je enige tijd na het opstarten een timer wilt activeren in plaats van op basis van de kalender. Als u bijvoorbeeld bij het opstarten moet controleren of uw server correct is gestart en werkt zoals bedoeld, kunt u een controleservice schrijven en die timerinstelling gebruiken om deze te activeren nadat het systeem voldoende tijd had om op te starten.

Laten we zeggen dat het systeem 3 minuten nodig heeft om op te starten, je zou het volgende kunnen doen:

OnBootSec=180

En ondanks de naam kun je ook doen:

OnBootSec=3 minuten

Als u zowel OnBootSec= als OnCalendar= specificeert, wordt de service gestart wanneer een van deze 2 gebeurtenissen plaatsvindt.

Oké, nu is het tijd om je bestand op te slaan, kopieer het naar de systeemmap als je mijn advies hierboven hebt opgevolgd, en test of je timer goed werkt.

Schakel uw nieuwe timer en monitoring in

Om je nieuwe timer te testen, moet je systemd vertellen dat je een nieuwe timer hebt toegevoegd, dus je moet deze opdracht typen:

$ sudo systemctl daemon-reload

Systemd houdt nu rekening met je nieuwe timer en kijkt goed wanneer je je taak moet uitvoeren. Aangezien systemd altijd actief is, is het tenslotte een van de beste kandidaten om uw geplande taken te beheren en uit te voeren.

Een ding dat je misschien contra-intuïtief vindt: een timer is standaard uitgeschakeld. Om het in te schakelen, moet u deze opdracht uitvoeren:

$ sudo systemctl enable --nu geautomatiseerde back-up.tijdopnemer

Je zult dan waarschijnlijk willen zien of je timer werkt zoals verwacht. Goed nieuws: systemd is zelfs zo vriendelijk om een ​​commando te hebben dat je vertelt wanneer het voor het laatst is gelanceerd en wanneer de volgende lancering is gepland (behalve als de timer is ingesteld om alleen bij het opstarten te worden uitgevoerd, omdat systemd natuurlijk niet weet wanneer het systeem opnieuw zal opstarten). Hier is dat commando:

$ systemctl status automatische back-up.tijdopnemer

Ten slotte, als u de timer niet langer nodig heeft, kunt u deze ook uitschakelen:

$ sudo systemctl uitschakelen --nu automatische back-up.tijdopnemer

Conclusie

Door systemd-timers te gebruiken, wordt uw beheer van geplande taken naar een hoger niveau getild: eerlijk gezegd vind ik persoonlijk dat geplande taken al jaren zo hadden moeten zijn.

Oh, een kleine verrassing voor jou: alle systemd-timers worden gelogd in een goed gestructureerd systeem met filtering, logrotatie en dergelijke. Dus ik nodig je uit om te zien hoe je logboeken over je geplande taken kunt zien!

Top Oculus App Lab-games
Als je eigenaar bent van een Oculus-headset, moet je op de hoogte zijn van sideloading. Sideloading is het proces van het installeren van niet-winkeli...
Top 10 spellen om te spelen op Ubuntu
Het Windows-platform is een van de dominante platforms voor gaming geweest vanwege het enorme percentage games dat tegenwoordig wordt ontwikkeld om Wi...
5 beste arcade-spellen voor Linux
Tegenwoordig zijn computers serieuze machines die worden gebruikt om te gamen. Als je de nieuwe hoge score niet kunt halen, weet je wat ik bedoel. In ...