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 = kasdienTiesą sakant, jis palaiko visas šias vertes:
- smulkiai
- kas valandą
- kasdien
- kas mėnesį
- kas savaitę
- kasmet
- kas ketvirtį
- 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:00Kaip 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:00Tada 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 UTCDabar 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 = 900To 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 = tiesaTač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“ = 180Nepaisant jo pavadinimo, taip pat galite padaryti:
„OnBootSec“ = 3 minutėsJei 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-reloadDabar „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ą.laikmatisTikriausiai 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.laikmatisGaliausiai, kai laikmačio nebereikia, galite jį išjungti:
$ sudo systemctl išjungti - dabar automatinė atsarginė kopija.laikmatisIš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!