systemd

Naujos kartos „Cron“ su „systemd“ Laikmačio kūrimas

Naujos kartos „Cron“ su „systemd“ Laikmačio kūrimas
Ar ateityje turite suplanuoti kokią nors užduotį savo kompiuteryje? Tai gali atrodyti paprasta - juk jūsų indų plovimo mašina gali palaukti prieš paleidimą mygtuko pagalba, tačiau kartais kompiuteriai atlieka tokias paprastas užduotis labai sunku.Bet jei turite kokių nors žinių, tikriausiai jau girdėjote kronas, Ši programinė įranga yra skirta tam, kad tinkama užduotis būtų atlikta tinkamu laiku. Tačiau šis įrankis tikrai buvo sukurtas atsižvelgiant į paprastumą ir galų gale jums gali kilti blogų staigmenų.Jei kada nors pavyko suplanuoti užduotį sistemoje „Windows“, naudojote „Windows“ užduočių planavimo priemonę. Pagal numatytuosius nustatymus jis turi GUI, tačiau dėl to jo taip paprasta naudoti: šios dvi sistemos tiesiog paleidžia procesą nustatytu laiku ir data.

Norėdami suprasti, kaip „systemd“ gali būti jums naudinga, paimsiu pavyzdį.

Kokių spąstų jūsų sistemos laikmačiai išvengs?

Jei kada nors turite mašiną su joje rūpimais duomenimis, norėtumėte, kad duomenų kopija būtų kitoje, tikriausiai saugesnėje vietoje. Jei tvarkote serverį, tai yra privaloma: juk kaip atsigauti, jei sugedo standusis diskas, ir neleisite atkurti jokių duomenų?

Taigi kaip atsakingas asmuo atsarginę kopiją nustatote kiekvieną savaitę arba kiekvieną dieną. Galite nustatyti jį naudodami „cron“, suplanuoti 4:24 val., Bet čia prasideda problema: ką daryti, jei jūsų serveris dėl kokios nors priežasties bus išjungtas nuo 4:10 iki 4:30?

Na, tikėtina, kad cronas tiesiog praleis tą atsarginę kopiją. Tai gali būti kritiška, jei tai atsitinka dažnai ir tyliai arba jei jūsų kodas remiasi tuo, kad jis veikia, ir kitaip gali nepavykti. Paprastai tai atsitinka, kai nustatote valymo užduotį per „cron“ ir ji nepaleidžiama. Staiga jūsų kodui gali nepakakti vietos tęsti ir jis suges - liūdna, tokia liūdna padėtis, tiesa, ponas Eltonas Johnas.

Tačiau jei praleista paleidimas gali sukelti problemų, įsivaizduokite vieną sekundę - oho, Johnas Lennonas dabar? - kad jūsų užduotis yra per lėta. Jei jūsų užduotis nustatyta vykdyti kas 10 minučių, bet užtrunka 15 minučių, „cron“ arba „Windows“ su malonumu paleidžia kitą užduotį, net jei dabartinės užduoties dar nėra - ir tuo pačiu metu turėsite vykdyti 2 užduoties atvejus , kuris yra puikus receptas dėl nelaimė. Kai programa veikia tuo pačiu metu, kai ji nėra skirta tam, ji tikrai sugadins failus, kitas programines įrangą, duomenų bazes - ir jūsų serveris staiga tampa skęstančiu laivu, tokiu kaip „Titanikas“.

Gerai, gal aš einu per toli su „Titaniku“, bet jūs suprantate. Nors „systemd“ negalėjo daug nuveikti gelbėdamas šį laivą, jis gali padėti jums pašalinti visus šiuos trūkumus ir užtikrinti ilgesnes kalėdines atostogas dėl klaidų, kurių jūsų išvengsite. Dabar atėjo laikas sužinoti, kaip nustatyti sistemos laikmačius.

Kaip suplanuoti automatinę serverio atsarginę kopiją?

Visų pirma, „systemd“ laikmačiai suaktyvina „systemd“ paslaugą, todėl prieš planuodami užduotį pirmiausia turėsite padaryti ją paslauga. Laimei, aš parašiau „systemd“ paslaugos kūrimo vadovą, tokiu būdu jis supažindins jus su „systemd“ darbo būdu. Prieš tęsdami turėtumėte perskaityti. Nebent jei tu tiksliai žinoti, ką darote, turėtų būti jūsų sistemos sistemos paslaugos failas ne yra bet koks „WantedBy =“ parametras. Jei norite paleisti paslaugą konkrečiu laiku, tikriausiai nenorite jos paleisti įkrovos metu.

„Systemd“ paslaugų sistemos dėka neįmanoma per klaidą paleisti kelių užduoties egzempliorių: jei užduotis jau vykdoma, ji tiesiog praleis tą paleidimą ir paliks šiuo metu vykdomą užduotį baigti savo darbą.

Kai turėsite suplanuoti „systemd“ paslaugą, sukurkite failą tokiu pačiu pavadinimu kaip ir jūsų tarnyba, išskyrus tai, kad jis turėtų baigtis .laikmatis vietoj .paslaugą. Mūsų automatinės atsarginės kopijos pavyzdyje paslauga būtų automatinė atsarginė kopija.paslauga ir laikmatis bus automatinis atsarginės kopijos kūrimas.laikmatis. Abu failai turėtų būti tame pačiame kataloge. Kaip sakiau jums sistemoje „systemd“, rekomenduoju šiuos failus parašyti įprastoje vietoje, pvz., Namų kataloge, tada, kai baigsite redagavimą, nukopijuokite juos į „systemd“ aplanką.

Taigi, leiskite man parodyti, kaip atrodo mūsų laikmačio failas:

[Vienetas]
Aprašymas = Suplanuokite atsargines kopijas ne piko valandomis
[Laikmatis]
„OnCalendar“ = * - * - * 03:00:00
RandomizedDelaySec = 7200
Nuolatinis = tiesa
[Diegti]
„WantedBy“ = laikmačiai.taikinys

Panašiai kaip sisteminių paslaugų atveju, čia yra 3 skyriai. [Unit] arba [Install] veikia lygiai taip pat, kaip paaiškinta mano sisteminių paslaugų straipsnyje. Atkreipkite dėmesį, kad „WantedBy =“ čia yra svarbus, nes laikmačius galima paleisti arba sustabdyti, taigi, jei jūs nenurodysite „systemd“ paleisti laikmatį įkrovos metu, jis niekada nesuaktyvins. laikmačiai.taikinys yra specialus laikmačių sistemos taikinys.

Dabar skyrius [Laikmatis]. Jame rasite visus nustatymus, susijusius su tuo, kada turėtų suaktyvinti laikmatis. Jei norite atlikti automatinę atsarginę kopiją, aš sakiau sistemai paleisti ją nuo 3 iki 5 val. Serverio laiko juostoje. Tikslus laikas yra atsitiktinis kiekvieną dieną.

OnCalendar = nustato laikmatį, susijusį su jūsų serverio laiku („wallclock“), pvz., Kiekvieną sekmadienį 13:00. Jei anksčiau naudojote „cron“, turėtumėte tikrai žinoti šią sintaksę. Tačiau jis turi tam tikrų papildomų privalumų.

Pavyzdžiui, jei norite, kad kas nors vyktų kas valandą, galite tai padaryti taip:

OnCalendar = kas valandą

ir kasdien:

OnCalendar = kasdien

Tiesą sakant, jis palaiko visas šias vertes:

  1. smulkiai
  2. kas valandą
  3. kasdien
  4. kas mėnesį
  5. kas savaitę
  6. kasmet
  7. kas ketvirtį
  8. kas pusmetį

Tačiau yra šių raktinių žodžių problema: pavyzdžiui, kasdien suaktyvinama vidurnaktis, kuris dažnai būna piko valanda skaičiavimo sistemose. Štai kodėl rekomenduojama naudoti RandomizedDelaySec = (jo naudojimas nurodytas žemiau). Bet kokiu atveju atsarginei kopijai tai nėra geras pasirinkimas: vidurnaktis nėra piko valandos, o atvirkščiai. Taigi turime tiksliau nustatyti, kai norime pamatyti tą užduotį.

Jei norite daugiau kontroliuoti, galite parašyti datą, pvz., 2018-12-06 12:49:37. Na, jei esate toks konkretus, kartą suaktyvinsite laikmatį. Kad jis pasikartotų, bet kurį iš šių elementų pakeisite žvaigždute *.

„OnCalendar“ = * - * - * 03:00:00

Kaip matote aukščiau, mūsų atsarginiame pavyzdyje visos datos dalis yra * - * - *, tai reiškia, kad ji turėtų vykti kiekvieną metų kiekvieno mėnesio dieną. Dabar, jei atliksite:

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

Tada jis vyksta kiekvieną gruodžio 25 d. 3 val. Puikus sistemos laikmatis Kalėdų seneliui - net jei abejoju, ar jo kada nors prireiks! Taigi žvaigždutė prideda pasikartojimą ten, kur įdėjote. Jei jūs įtraukėte jį į metų lauką, tai reiškia „kiekvienais metais“ ir kt.

Galiausiai galite pridėti UTC eilutės pabaigoje, kad vietoj laiko juostos būtų naudojamas UTC laikas. Pavyzdžiui, kai kurios tarnybos iš naujo nustato API kvotas vidurnaktį, tačiau, norėdamos išvengti laiko juostos šališkumo, naudoja UTC. Taigi atlikdami tokias užduotis atliktumėte:

OnCalendar = dienos UTC

Dabar išspręskime kitą problemą: piko valandos. systemd taip pat turi kovos su tuo aplinką.

RandomizedDelaySec = leidžia atidėti atsitiktinio laiko užduotį. Vertė yra didžiausias sekundžių skaičius, kurį laikmatis atidels. Jis specialiai skirtas tokiems atvejams. Pamenate, kad sistemoje kasdien kaskart suveikia vidurnaktis? Na, kas savaitę visada suveikia pirmadienio vidurnaktį, o kasmet - sausio 1 dienos vidurnaktį, tai yra viena blogiausių metų viršūnių, kai visur nutrūksta tinklo. Jūs tikrai nenorite, kad taip atsitiktų.

Pridėdami uždelsimą, pašalinsite šią problemą: ji automatiškai uždels nežinomą laiką jūsų užduotį. Čia atsitiktinumas yra svarbus, nes jis yra daug labiau tikėtinas, net jei jis yra atsitiktinis, o tolygus krūvis leidžia geriau optimizuoti jūsų užduotis.

Tarkime, kad turite atlikti savo užduotis apie 7 valandą ryto, bet norite leisti šiek tiek vėluoti iki 15 minučių, tai padarysite taip:

RandomizedDelaySec = 900

To turėtų pakakti vėlavimui. Kartais užtenka net milisekundžių vėlavimo, kad būtų išvengta nenumatytų šuolių.

Nuolatinis = rūpinasi praleistais laikmačio trigeriais. Kas bus, jei jūsų serveris bus išjungtas naktį? Na, atsarginė kopija niekada niekada nesuveiktų. Nustačius į „true“, tokiais atvejais „systemd“ gali paleisti kitą įkrovą. Tokiu būdu vienaip ar kitaip žinote, laikmačio užduotis bus vykdoma. Jo naudojimas yra paprastas, jūs tiesiog tai darote:

Nuolatinis = tiesa

Tačiau tai turi vieną trūkumą, kurio ir taip sunku išvengti: kai praleidžiamos kelios užduotys iš skirtingų laikmačių, jos visos bus paleistos ir sulėtins įkrovą. Mano nuomone, tai daug geriau, nei tada, kai jis niekada neveikia, ir galų gale tai yra normalu, tinkamiausias laikas paleisti laikmatį yra tada, kai jis yra suplanuotas, vėliau jis vistiek bus netinkamas.

„OnBootSec =“ yra paskutinė parinktis, kurią jums parodysiu (bet ne ką mažiau). Taip yra, jei norite paleisti laikmatį praėjus kuriam laikui po įkrovos, o ne pagal kalendorių. Pvz., Jei jums reikia patikrinti paleidimo metu, jei jūsų serveris tinkamai paleistas ir veikia taip, kaip numatyta, galite parašyti tikrinimo paslaugą ir naudoti tą laikmačio nustatymą, kad suaktyvintumėte, kai sistema turės pakankamai laiko paleisti.

Tarkime, kad sistemai paleisti reikia 3 minučių, tai galite padaryti:

„OnBootSec“ = 180

Nepaisant jo pavadinimo, taip pat galite padaryti:

„OnBootSec“ = 3 minutės

Jei tiksliai nurodysite „OnBootSec =“ ir „OnCalendar =“, ji paleis paslaugą, kai nutiks bet kuris iš šių 2 įvykių.

Gerai, dabar atėjo laikas išsaugoti failą, nukopijuoti jį į sistemos aplanką, jei laikėtės mano patarimo, ir patikrinti, ar laikmatis veikia tinkamai.

Įjunkite naują laikmatį ir stebėjimą

Norėdami išbandyti naują laikmatį, turite pranešti sistemai, kad pridėjote naują laikmatį, todėl turite įvesti šią komandą:

$ sudo systemctl daemon-reload

Dabar „systemd“ atsižvelgs į jūsų naują laikmatį ir atidžiai išnagrinės, kada paleisti užduotį. Kadangi „systemd“ visada veikia, tai yra vienas geriausių kandidatų valdyti ir vykdyti suplanuotas užduotis.

Vis dėlto vienas dalykas gali atrodyti priešingas: laikmatis pagal nutylėjimą yra išjungtas. Norėdami jį įgalinti, turite atlikti šią komandą:

$ sudo systemctl įjungti - dabar automatinę atsarginę kopiją.laikmatis

Tikriausiai norėsite sužinoti, ar jūsų laikmatis veikia taip, kaip tikėtasi. Geros naujienos: „systemd“ netgi yra tokia maloni, kad turi komandą, nurodančią, kada ji paskutinį kartą buvo paleista ir kada numatytas kitas paleidimas (išskyrus atvejus, kai laikmatis nustatytas veikti tik įkrovos metu, nes „systemd“ nežino, kada sistema vėl bus paleista). Štai ta komanda:

$ systemctl būsenos automatinė atsarginė kopija.laikmatis

Galiausiai, kai laikmačio nebereikia, galite jį išjungti:

$ sudo systemctl išjungti - dabar automatinė atsarginė kopija.laikmatis

Išvada

Naudojant sisteminius laikmačius, jūsų suplanuotų užduočių valdymas yra kitame lygyje: nuoširdžiai, aš asmeniškai manau, kad suplanuotos užduotys turėjo būti tokios jau nuo metų.

O, viena maža staigmena jums: visi sistemos laikmačiai yra užregistruoti gerai sukonstruotoje sistemoje su filtravimu, žurnalo pasukimu ir panašiai. Taigi kviečiu pamatyti, kaip galite pamatyti žurnalus apie savo suplanuotas užduotis!

Kaip naudoti „AutoKey“, norint automatizuoti „Linux“ žaidimus
„AutoKey“ yra darbalaukio automatizavimo įrankis, skirtas „Linux“ ir „X11“, užprogramuotas „Python 3“, „GTK“ ir „Qt“. Naudodami scenarijų ir „MACRO“ f...
Kaip parodyti FPS skaitiklį „Linux“ žaidimuose
„Linux“ žaidimai gavo didelį postūmį, kai „Valve“ paskelbė „Linux“ palaikymą „Steam“ klientui ir jų žaidimams 2012 m. Nuo tada daugelis AAA ir indie ž...
Kaip atsisiųsti ir paleisti „Sid Meier Civilization VI“ sistemoje „Linux“
Įvadas į žaidimą „Civilization 6“ yra šiuolaikinė klasikinės koncepcijos, pristatytos „Age of Empires“ žaidimų serijoje, koncepcija. Idėja buvo gana p...