systemd

Next Generation Cron systemd-vel Időzítő létrehozása

Next Generation Cron systemd-vel Időzítő létrehozása
Be kell ütemeznie valamilyen feladatot a jövőben a számítógépén? Ez egyszerűnek tűnhet - elvégre a mosogatógépe egy gomb segítségével képes megvárni az indítást, de néha a számítógépek ilyen egyszerű feladatokat végeznek Olyan keményen.De ha van valamilyen háttere, akkor valószínűleg hallott róla cron, ez a szoftver teljesen elkötelezett a megfelelő feladat megfelelő időben történő elindítása érdekében. De ezt az eszközt valóban az egyszerűség szem előtt tartásával tervezték, és a végén rossz meglepetéseket okozhat.Ha valaha is sikerült ütemeznie egy feladatot a Windows rendszeren, akkor a Windows Feladat-tervezőjét használta. Alapértelmezés szerint rendelkezik GUI-val, de nem teszi annyira egyszerűvé a használatát is: ez a két rendszer csak egy meghatározott időben és dátumban indít folyamatot.

Annak megértése érdekében, hogy a systemd milyen hasznos lehet számodra, példát veszek.

Milyen buktatókat fog elkerülni a rendszer időzítői?

Ha valaha rendelkezik egy géppel, amelyben benne vannak az Ön számára fontos adatok, akkor az adatainak másolatát egy másik, valószínűleg biztonságosabb helyen szeretné. Ha szervert kezel, akkor ez kötelező: végül is hogyan lehet helyreállítani, ha a merevlemez meghibásodik, és megakadályozza az adatok helyreállítását?

Tehát felelős személyként minden héten vagy minden nap beállít biztonsági mentést. Beállíthatja a cron használatával, 4: 24-kor ütemezheti, de itt kezdődik a probléma: Mi van akkor, ha a szervere bármilyen okból 4: 10-től 4: 30-ig leáll?

Nos, valószínűleg a cron kihagyja a biztonsági mentést. Ez kritikus lehet, ha ez gyakran és csendesen történik, vagy ha a kódja a futásra támaszkodik, és másképp meghibásodhat. Általában ez akkor történik, ha a cron segítségével beállít egy tisztítási feladatot, és az nem indul el. Hirtelen előfordulhat, hogy a kódnak nincs elegendő hely a folytatáshoz, és meg fog törni - szomorú, olyan szomorú helyzet, igaz, Mr. Elton John.

Ha azonban az elmaradt indítás problémát okozhat, képzeljen el egy másodpercet - wow, John Lennon most? - hogy a feladata túl lassú. Ha a feladat 10 percenként futásra van állítva, de 15 percet vesz igénybe, a cron vagy a Windows boldogan elindít egy másik feladatot, még akkor is, ha az aktuális feladat még nem ment el - így a feladat 2 példánya egyidejűleg fut , ami a tökéletes recept mert katasztrófa. Ha egy program egyidejűleg fut, miközben nem erre tervezték, akkor valószínűleg megrongálja a fájlokat, más szoftvereket, adatbázisokat - és a szervered hirtelen süllyedő hajóvá válik, mint a Titanic.

Rendben, talán túl messzire megyek a Titanic-szal, de megkapod az ötletet. Noha a systemd nem sokat tehetett volna ennek a hajónak a megmentésében, ez a hiányosságokhoz segítséget nyújthat, és hosszabb karácsonyi vakációt biztosíthat a hibáknak köszönhetően, amelyeket elkerülni fog. Itt az ideje, hogy megismerje a systemd időzítők beállítását.

Az automatikus szervermentés ütemezése?

Először is, a systemd időzítők elindítanak egy systemd szolgáltatást, ezért a feladat ütemezése előtt először szolgáltatássá kell tenni. Szerencsére írtam egy útmutatót a systemd szolgáltatás létrehozására, így bemutatja a systemd munkamódszerét. Olvassa el, mielőtt folytatja. Hacsak nem pontosan tudja, mit csinál, a systemd szolgáltatásfájljának meg kell lennie nem tartalmazhat bármilyen WantedBy = beállítást. Ha egy meghatározott időpontban szeretné elindítani a szolgáltatását, valószínűleg nem indításkor kívánja elindítani.

A systemd szolgáltató rendszernek köszönhetően lehetetlen, hogy a feladat több példányát tévedésből futtassák: ha egy feladat már fut, akkor csak kihagyja az indítást, és az éppen futó feladatot befejezi.

Ha van egy systemd szolgáltatás ütemezése, hozzon létre egy fájlt a szolgáltatással megegyező fájlnévvel, azzal a különbséggel, hogy ennek vége legyen .időzítő helyett .szolgáltatás. Automatizált biztonsági mentési példánkban a szolgáltatás automatikus biztonsági mentés lenne.szolgáltatás és az időzítő automatikus mentés lenne.időzítő. Mindkét fájlnak ugyanabban a könyvtárban kell lennie. Amint azt a systemd szolgáltatás cikkében elmondtam, azt javaslom, hogy ezeket a fájlokat írja be egy normál helyre, például a saját könyvtárába, majd másolja át őket egy systemd mappába, miután befejezte a szerkesztéseket.

Tehát hadd mutassam meg, hogy néz ki az időzítő fájlunk:

[Mértékegység]
Leírás = A biztonsági mentések ütemezése csúcsidőn kívül
[Időzítő]
OnCalendar = * - * - * 03:00:00
RandomizedDelaySec = 7200
Tartós = igaz
[Telepítés]
WantedBy = időzítők.cél

Hasonlóan a systemd szolgáltatásokhoz, itt is 3 szakasz van. A [Unit] vagy a [Install] pontosan ugyanúgy működik, mint ahogy azt a systemd services cikkemben kifejtettem. Kérjük, vegye figyelembe, hogy a WantedBy = itt fontos, mert az időzítők elindíthatók vagy leállíthatók, tehát ha nem mondja meg a systemd-nek, hogy indítsa el az időzítőt indításkor, az soha nem váltja ki. időzítők.A target egy speciális systemd cél az időzítők számára.

Most az [Időzítő] szakasz. Benne talál minden beállítást, amely az időzítő bekapcsolásának idejére vonatkozik. Az automatikus biztonsági mentéshez azt mondtam a systemd-nek, hogy 3 és 5 óra között futtassa a szerver időzónáján. A pontos idő minden nap véletlenszerű.

OnCalendar = a szerver idejéhez (faliórához) tartozó időzítőt állítja be, például minden vasárnap 13 órakor. Ha korábban használta a cront, akkor ismernie kell ezt a szintaxist. Van azonban néhány további előnye.

Például, ha azt szeretné, hogy valami óránként történjen, akkor ezt teheti:

OnCalendar = óránként

és naponta:

OnCalendar = naponta

Valójában a következő értékek mindegyikét támogatja:

  1. percenként
  2. óránkénti
  3. napi
  4. havi
  5. heti
  6. évi
  7. negyedévenként
  8. félévente

Van azonban probléma ezekkel a kulcsszavakkal: például a napi indítás mindig éjfél, ami gyakran csúcsidő a számítástechnikai rendszerekben. Ezért ajánlott a RandomizedDelaySec = használatát (használatát az alábbiakban adjuk meg). Egyébként a biztonsági mentéshez ez nem jó lehetőség: éjfél nem csúcsidőn kívül van, inkább fordítva. Pontosabban kell beállítanunk, amikor azt akarjuk, hogy a feladat elinduljon.

Ha nagyobb irányítást szeretne, írhat egy dátumot, például 2018-12-06 12:49:37. Nos, ha konkrét vagy, akkor egyszer csak bekapcsolod az időzítőt. Ahhoz, hogy ismétlődő legyen, ezen elemek bármelyikét * csillaggal kell kicserélnie.

OnCalendar = * - * - * 03:00:00

Amint a fentiekből látható, a biztonsági példánkban a dátum minden része * - * - *, vagyis minden év minden hónapjának minden napjának meg kell történnie. Most, ha:

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

Ezután december 25-én 3 órakor tart. Tökéletes systemd időzítő a Mikulás számára - még akkor is, ha kétlem, hogy valaha is szüksége lesz rá! Tehát a csillag megismétli a megismétlődést ott, ahova tette. Ha évmezőbe helyezi, az azt jelenti, hogy „minden évben” stb.

Végül felveheti az UTC-t a sor végére, hogy a helyi időzóna helyett az UTC-időt használja. Egyes szolgáltatások például éjfélkor visszaállítják API kvótáikat, de az időzóna-torzítás elkerülése érdekében UTC-t használ. Tehát az ilyen feladatok elvégzéséhez:

OnCalendar = napi UTC

Most oldjunk meg egy másik problémát: csúcsidőt. A systemd-nek is van lehetősége harcolni ez ellen.

RandomizedDelaySec = lehetővé teszi a feladat véletlenszerű késleltetését. Az érték az időzítő késleltetésének másodpercek maximális száma. Kifejezetten ilyen esetekre készült. Emlékszel, hogy a systemd-ben a napi mindig éjfélkor vált ki? Nos, a hét mindig hétfőn éjfélkor, az évente pedig január 1-én éjfélkor váltja ki, ez az év egyik legrosszabb csúcsa, mindenhol hálózati kiesések vannak. Te biztosan nem akarod, hogy ez megtörténjen.

Késleltetés hozzáadásával eltávolítja a problémát: ismeretlen időpontban automatikusan késlelteti a feladatot. A véletlenszerűség itt azért fontos, mert sokkal valószínűbb, ha véletlenszerű, és az egyenletes terhelés lehetővé teszi a feladatok jobb optimalizálását.

Tegyük fel, hogy reggel 7 óra körül kell lebonyolítanod a feladataidat, de egy kis, legfeljebb 15 perces késleltetést szeretnél engedélyezni, ezt tennéd:

RandomizedDelaySec = 900

Ennek elégnek kell lennie a késésekhez. Néha akár milliszekundumos késések is elegendőek a nem szándékos tüskék megelőzéséhez.

Állandó = gondoskodik az elmulasztott időzítő triggerekről. Mi van, ha a szerver éjszaka leáll? Nos, a biztonsági mentés soha nem váltana ki. Igazra állítva a systemd ilyen esetekben futtathatja a következő indításkor. Így vagy így, vagy úgy tudja, az időzítő feladata lefut. Használata egyszerű, csak ezt kell tennie:

Tartós = igaz

Ennek azonban van egy hátránya, amelyet egyébként is nagyon nehéz elkerülni: ha több, különböző időzítőkből álló feladat hiányzik, mindegyik indításkor fut, és lelassítja ezt a rendszerindítást. Véleményem szerint ez sokkal jobb, mintha soha nem futna, és végül is ez normális, az időzítő futtatására a legmegfelelőbb pillanat az ütemezés, utána valószínűleg úgyis helytelen lesz.

Az OnBootSec = az utolsó lehetőség, amelyet megmutatok (de nem utolsósorban). Ez az, ha egy időzítőt a rendszerindítás után valamivel be akar kapcsolni a naptár helyett. Például, ha ellenőriznie kell az indításkor, ha a szerver megfelelően indul, és rendeltetésszerűen működik, írhat egy ellenőrző szolgáltatást, és az időzítő beállításával aktiválhatja azt, miután a rendszernek elegendő ideje volt az indításra.

Tegyük fel, hogy a rendszernek 3 percre van szüksége az indításhoz:

OnBootSec = 180

És neve ellenére megteheti:

OnBootSec = 3 perc

Ha mind az OnBootSec =, mind az OnCalendar = pontot megadja, akkor a szolgáltatás elindítja, amikor a 2 esemény bármelyike ​​megtörténik.

Oké, itt az ideje, hogy mentse a fájlt, másolja a rendszer mappájába, ha betartotta a fenti tanácsomat, és tesztelje, hogy az időzítő megfelelően működik-e.

Engedélyezze az új időzítőt és felügyeletet

Az új időzítő teszteléséhez el kell mondania a systemd-nek, hogy új időzítőt adott hozzá, ezért be kell írnia ezt a parancsot:

$ sudo systemctl daemon-reload

Most a systemd figyelembe veszi az új időzítőt, és alaposan megvizsgálja a feladat futtatásának idejét. Mivel a systemd mindig fut, végül is az egyik legjobb jelölt kezeli és futtatja az ütemezett feladatokat.

Egy dolgot mégis ellentmondásosnak találhat: az időzítő alapértelmezés szerint le van tiltva. Engedélyezéséhez ezt a parancsot kell tennie:

$ sudo systemctl enable --now automatized-backup.időzítő

Ezután valószínűleg meg szeretné tudni, hogy az időzítő a várt módon működik-e. Jó hír: a systemd még olyan kedves is, hogy van egy parancs, amely megmondja, hogy mikor indították utoljára és mikor ütemezik a következő indítást (kivéve, ha az időzítő úgy van beállítva, hogy csak indításkor fusson, mivel a systemd nyilván nem tudja, mikor indul újra a rendszer). Itt van ez a parancs:

$ systemctl állapot automatizált mentés.időzítő

Végül, ha már nincs szüksége az időzítőre, akkor azt is letilthatja:

$ sudo systemctl disable --owow automatated-backup.időzítő

Következtetés

A rendszeridőzítők használatával az ütemezett feladatok kezelése egy újabb szintre kerül: őszintén szólva, személy szerint úgy érzem, hogy az ütemezett feladatoknak már évek óta így kellett volna lenniük.

Ó, egy kis meglepetés számodra: az összes systemd időzítőt egy jól strukturált rendszerbe naplózzák, szűréssel, naplófordítással és minden hasonlóval. Ezért meghívlak benneteket, hogy lássák, hogyan láthatják az ütemezett feladatok naplóit!

Az egérmutató és a kurzor méretének, színének és sémájának módosítása a Windows 10 rendszeren
Az egérmutató és a kurzor a Windows 10 operációs rendszerben nagyon fontos szempont. Ez elmondható más operációs rendszerekről is, tehát valójában eze...
Ingyenes és nyílt forráskódú játékmotorok a Linux játékok fejlesztéséhez
Ez a cikk felsorolja azokat az ingyenes és nyílt forráskódú játékmotorokat, amelyek felhasználhatók 2D és 3D játékok fejlesztésére Linuxon. Számos ily...
Shadow of the Tomb Raider for Linux Tutorial
A Shadow of the Tomb Raider a Tomb Raider sorozat tizenkettedik kiegészítője - az Eidos Montreal által létrehozott akció-kaland játék franchise. A ját...