Kako uporabljati systemctl za upravljanje storitev in enot
V sistemu Linux ima systemctl osrednjo vlogo pri upravljanju sistema init in upravitelja storitev systemd. S pomočjo systemctl imajo uporabniki nadzor nad storitvami systemd, njegovimi enotami in nastavitvami, kar ga naredi nepogrešljivo orodje za sistemsko upravljanje. Od nadzora zagona do prilagajanja stanja sistema systemctl ponuja obsežen nabor funkcij.
Kaj je systemctl?
systemctl je orodje za upravljanje systemd prek ukazne vrstice; systemd je zagonski sistem in sistemski upravitelj za operacijske sisteme Linux. systemd je danes standardni zagonski sistem za številne distribucije Linuxa in strežniške distribucije Linuxa, kot so Ubuntu, Debian, Fedora, Red Hat Enterprise Linux (RHEL), CentOS, Arch Linux, Mageia in Gentoo. Vendar pa ni vgrajen v vseh distribucijah.
V sistemu systemd ima systemctl osrednjo vlogo pri upravljanju sistemskih storitev, konfiguraciji, načinu zagona in vzdrževanju sistema. Funkcionalnost tega orodja presega zgolj zagon in zaustavitev storitev. Omogoča celovito upravljanje skoraj vseh vidikov sistema Linux.
V naslednjem vodiču boste našli praktične primere kode in ukaze za Linux za uporabo systemctl. Spodnji primeri temeljijo na sistemu Ubuntu 22.04.
Upravljanje storitev
Glavni namen sistema init je zagon komponent, ki so potrebne po zagonu jedra Linux (komponente uporabniškega prostora ). Sistem init se uporablja tudi za učinkovito upravljanje storitev in demonov na strežniku kadarkoli med delovanjem sistema.
V sistemu systemd se večina procesov osredotoča na vire, ki jih upravlja sistem. Ti se imenujejo enote. Enote so razvrščene glede na vrsto vira, ki ga predstavljajo, in so opredeljene v datotekah enot. Vrsto enote lahko prepoznate po končnici datoteke.
Pri upravljanju storitev so pomembne storitvene enote, ki se končajo s končnico .service. Vendar pa pri ukazih za upravljanje storitev ta končnica ni vedno potrebna. systemd sam prepozna, da se taki ukazi na splošno nanašajo na storitve.
Zagon in zaustavitev storitev
Ena najpogostejših nalog, ki se v sistemu Linux izvajajo s sistemskim orodjem systemctl, je zagon in zaustavitev storitev. Te funkcije so ključnega pomena za sistemsko administracijo in vam omogočajo nadzor nad procesi, ki tečejo v sistemu. Za zagon storitve uporabite ukaz start. Če delate kot uporabnik brez root pravic, boste morali uporabiti sudo.
$ sudo systemctl start application.servicebashKer je sistem systemd zasnovan tako, da samodejno išče datoteke .service za ukaze za upravljanje storitev, lahko ukaz vnesete tudi v poenostavljeni obliki:
$ sudo systemctl start applicationbashČe želite na primer zagnati spletni strežnik Apache, vnesite:
$ sudo systemctl start apache2bashČe želite ustaviti zagnano storitev, uporabite stop:
$ sudo systemctl stop application.servicebashPonovni zagon in ponovno nalaganje
Če želite ponovno zagnati storitev, kar je pogosto potrebno po spremembi nastavitev, uporabite ukaz restart:
$ sudo systemctl restart application.servicebashČe aplikacija lahko ponovno naloži svoje konfiguracijske datoteke brez ponovnega zagona, lahko za zagon tega postopka uporabite ukaz reload:
$ sudo systemctl reload application.servicebashČe niste prepričani, ali storitev omogoča ponovno nalaganje konfiguracije, lahko uporabite ukaz reload-or-restart. Če je ta možnost podprta, bo ukaz ponovno naložil konfiguracijo. Če pa ni podprta, bo ukaz ponovno zagnal storitev, da se sproži posodobitev konfiguracije.
$ sudo systemctl reload-or-restart application.servicebashVklop in izklop storitev
Z vklopom in izklopom storitev lahko določite, ali naj se storitev samodejno zažene ob zagonu sistema. To je še posebej pomembno za zmogljivost sistema, varnost in upravljanje odvisnosti med različnimi storitvami. Za nastavitev samodejnega zagona ob zagonu sistema uporabite ukaz enable:
$ sudo systemctl enable application.servicebashKo se ta postopek izvede, se ustvari simbolična povezava. Ta povezava povezuje kopijo datoteke sistemske storitve. Datoteko sistemske storitve je običajno mogoče najti v mapi /lib/systemd/system ali /etc/systemd/system. Tukaj boste našli tudi mapo na trdem disku, v kateri systemd išče datoteke za samodejni zagon. To se običajno nahaja v mapi /etc/systemd/system/some_target.target.wants.
$ sudo systemctl enable application.servicebashČe želite preprečiti, da se storitev samodejno zažene ob zagonu sistema, uporabite disable:
$ sudo systemctl disable application.servicebashNato bo simbolna povezava, ki določa samodejno zagon ob zagonu sistema, izbrisana.
Opozorilo: Samo z vklopom storitve se ta v trenutni seji ne bo takoj zagnal. Če želite storitev zagnati takoj in jo nastaviti tako, da se samodejno zažene ob zagonu sistema, morate izvesti oba ukaza start in enable.
Preverite stanje storitev
Z ukazom systemctl lahko prikažete informacije o stanju storitev. To je še posebej koristno za spremljanje in diagnosticiranje trenutnega stanja sistemskih storitev in storitev aplikacij. Za preverjanje uporabite ukaz status
$ systemctl status application.servicebashTa ukaz prikaže vrsto informacij, vključno s trenutnim stanjem storitve (aktivna, neaktivna, okvarjena itd.), zadnjimi izvedenimi procesi in sporočili dnevnika, hierarhijo cgroup ter prvimi vrsticami dnevnika.
Za preverjanje trenutnega stanja storitve v sistemu Linux s pomočjo systemctl se uporabi is-active. Ta ukaz pokaže, ali je storitev trenutno aktivna ali ne:
$ systemctl is-active application.servicebashTrenutno stanje je običajno označeno s active, če je storitev aktivna, ali s številko inactive, če je storitev neaktivna.
Če želite preveriti, ali je storitev nastavljena tako, da se samodejno zažene ob zagonu sistema, lahko uporabite ukaz is-enabled. To je še posebej koristno pri upravljanju nastavitev zagona storitev v sistemu Linux.
$ systemctl is-enabled application.servicebashUkaz pokaže, ali je storitev aktivirana ali deaktivirana, in glede na odgovor ustrezno nastavi izhodno kodo na »0« ali »1«.
Z ukazom is-failed lahko preverite tudi, ali ima določena storitev status napake:
$ systemctl is-failed application.servicebashČe je izvedba uspešna, se izpiše active. Če pride do napake, se izpiše failed. Če je bila enota namerno ustavljena, se kot odgovor lahko prikaže unknown ali inactive. Izhodni status 0 pomeni, da je prišlo do napake, medtem ko 1 označuje kateri koli drug status.
Stanje sistema
Doslej predstavljeni ukazi so se osredotočali na upravljanje posameznih storitev. Ti ukazi pa ne ponujajo vpogleda v trenutno stanje sistema. Obstaja vrsta ukazov systemctl, ki lahko zagotovijo prav takšne informacije.
list-units je koristen za pridobitev pregleda nad trenutno nameščenimi paketi v sistemu Linux:
$ systemctl list-unitsbashKo izvedete ta ukaz, systemctl prikaže seznam enot, ki jih upravlja systemd. Izpis tega seznama vsebuje različne stolpce s podrobnimi podatki o vsaki enoti. Prikazani so naslednji stolpci:
- UNIT: Ime enote (pogosto se prevzame iz imena datoteke enote, npr. sshd.service za SSH-demona
- LOAD: Kaže, ali je bila datoteka enote uspešno naložena; možne vrednosti so
loaded,not-foundalierror. - ACTIVE: Stanje aktivnosti enote, ki se lahko spreminja med načini, kot so
active,inactive,activatingalideactivating - SUB: Podrejeni status aktivnosti, ki daje dodatne podrobnosti o stanju enote (na primer, enota
activebi lahko imela status SUBrunning,exitedalifailed). - DESCRIPTION: Kratek opis enote, ki pogosto odraža namen ali funkcionalnost enote
Vendar pa ta ukaz privzeto prikaže le aktivne enote. Zaradi tega stolpec LOAD v izpisu običajno prikazuje loaded, stolpec ACTIVE pa active. Z dodatnimi oznakami je mogoče systemctl nastaviti tako, da prikaže tudi dodatne informacije. Na primer, z uporabo oznake --all se prikažejo vse enote, ki jih je naložil systemd, ne glede na njihov trenutni status aktivnosti.
$ systemctl list-units --allbashIzpis je mogoče dodatno natančneje prilagoditi z uporabo dodatnih oznak, kot je --state=, s katerimi lahko filtrirate določene stanje v kategorijah LOAD, ACTIVE ali SUB. Pomembno je, da ohranite oznako --all, da se prikažejo tudi neaktivne enote:
$ systemctl list-units --all --state=inactivebashUporabite lahko tudi filter --type= za prikaz določenih vrst enot, npr. če želite videti samo enote v aktivni službi:
$ systemctl list-units --type=servicebashPrikaži vse datoteke enot
Če želite v sistemu Linux s pomočjo ukaza systemctl prikazati seznam vseh datotek enot (vključno s tistimi, ki jih systemd ni poskušal naložiti), lahko uporabite list-unit-files. Ta ukaz prikaže vse datoteke enot, ki jih systemd zazna, vključno s storitvami, vtičnicami, cilji in drugimi.
$ systemctl list-units-filesbashTa ukaz prikaže različna stanja datotek enot. Ta stanja kažejo, kako so posamezne enote nastavljene, zlasti kar zadeva njihovo delovanje ob zagonu sistema. Najpogostejša stanja so
- Omogočeno: Naprava je nastavljena tako, da se samodejno vklopi ob zagonu sistema.
- Onemogočeno: Enota ni nastavljena za samodejni zagon med zagonom sistema.
- Zakrita: Enota je popolnoma onemogočena, tako da je ni mogoče zagnati niti ročno niti samodejno.
- Statično: Enota se ne zažene samostojno, ampak je običajno odvisna od druge enote in se zažene le v tem kontekstu.
Upravljanje enote
Ena od glavnih nalog sistema systemctl je upravljanje enot. Systemctl ponuja vrsto uporabnih ukazov in možnosti, ki olajšujejo pridobivanje podrobnih informacij o posameznih enotah ter njihovo upravljanje.
Prikaži datoteko enote
Če želite, da se vsebina določene datoteke enote prikaže neposredno v konzoli, lahko uporabite ukaz cat. Če želite na primer pregledati datoteko enote za storitev, kot je ssh.service, vnesite:
$ systemctl cat ssh.servicebashPrikaži odvisnosti
Če uporabite list-dependencies, se bodo odvisnosti določene enote prikazale v drevesni strukturi. Ukaz je takšen:
$ systemctl list-dependencies sshd.servicebashPraviloma se prikažejo odvisnosti za .target enot, ki predstavljajo različna stanja sistema. Za popoln, rekurziven seznam vseh odvisnosti uporabite oznako --all.
Če želite prikazati obratne odvisnosti (tj. enote, ki so odvisne od navedene enote), dodajte k ukazu --reverse. Oznaki --before in —after vam omogočata tudi prikaz odvisnosti, ki se začnejo pred ali po zadevni enoti.
Enote za prikrivanje in razkrivanje
Z maskiranjem enote se ta dejansko onemogoči, tako da je ni mogoče zagnati niti ročno niti samodejno. To se pogosto uporablja za zagotovitev, da se storitev ali enota ne zažene po nesreči ali samodejno zaradi odvisnosti. Maskiranje se izvede z ustvarjanjem simbolične povezave ustrezne datoteke enote do /dev/null s pomočjo ukaza mask:
$ sudo systemctl mask nginx.servicebashTako je zagotovljeno, da storitve Nginx ni mogoče zagnati niti ročno niti samodejno, dokler je v zakritem načinu.
Odstranitev maske s enote prekliče njen status »maskiran«, tako da jo je mogoče ponovno normalno zagnati. Ukaz za odstranitev maske je unmask:
$ sudo systemctl unmask nginx.servicebashUrejanje datotek enot
systemctl ponuja možnosti za prilagajanje in spreminjanje datotek enot. Te funkcije so bile uvedene z različico 218 sistema systemd. Če uporabite ukaz edit, se datoteka enote v izbrani enoti samodejno odpre za urejanje:
$ sudo systemctl edit nginx.servicebashPri urejanju se ustvari prazna datoteka, v katero se dodajo ali spremenijo določena navodila za definicijo enote. Za vsako enoto (npr. nginx.service) se v imeniku /etc/systemd/system ustvari podimenik, pri čemer se imenu datoteke doda končnica .d. V zgornjem primeru bi bil podimenik nginx.service.d.
V tej podmapi se ustvari datoteka override.conf. Ko systemd naloži enoto, združi vsebino te datoteke z izsekom z izvirno datoteko enote. Pri tem imajo navodila iz izseka prednost. Za obdelavo celotne datoteke enote se lahko uporabi oznaka --full:
$ sudo systemctl edit --full nginx.servicebashS pritiskom na --full ko --full se obstoječa datoteka enote odpre v urejevalniku, da jo lahko spremenite. Ob zaprtju urejevalnika sistem shrani spremenjeno datoteko v mapo /etc/systemd/system.
Če želite razveljaviti spremembe, ki ste jih sami naredili, lahko izbrišete bodisi konfiguracijski imenik .d naprave bodisi spremenjeno datoteko v /etc/systemd/system:
$ sudo rm -r /etc/systemd/system/nginx.service.dbashPopolnoma prenovljeno datoteko enote lahko izbrišete z naslednjim ukazom:
$ sudo rm /etc/systemd/system/nginx.servicebashPo odstranitvi datoteke ali mape boste morali ponovno zagnati systemd, da ne bo več skliceval na izbrisane datoteke, temveč bo ponovno uporabil sistemsko kopijo:
$ sudo systemctl daemon-reloadbashPrilagajanje stanja sistema (stopnja delovanja) s cilji
systemd uporablja predvsem cilje (target) za združevanje različnih enot. To se izvaja z namenom doseganja določenega stanja sistema, podobno kot pri ravneh delovanja (runlevels) v drugih sistemih za zagon. Datoteke s končnico .target delujejo kot orientacijske točke, ki kažejo stanje razpoložljivosti določenih funkcij. To uporabnikom omogoča, da namesto posameznih potrebnih enot določijo želeno splošno stanje.
Praktičen primer je swap.target, ki označuje stanje pripravljenosti za zamenjavo. Enote, vključene v proces zamenjave, se lahko uskladijo s tem ciljem z uporabo konfiguracijskih možnosti, kot WantedBy= ali RequiredBy=. Enote, ki so odvisne od zamenjave, pa lahko to označijo z nastavitvami, kot so Wants=, Requires= in After=, da izrazijo svojo odvisnost in vrstni red zagona v zvezi z zamenjavo.
Pridobivanje in nastavitev privzete destinacije
S prikazom in nastavitvijo privzetega cilja lahko določite privzeto stanje sistema ob zagonu. Tako poiščete privzeti cilj za svoj sistem:
$ systemctl get-default
Output
multi-user.targetbashČe želite spremeniti privzeti cilj, uporabite ukaz set-default skupaj z imenom cilja. Z naslednjim ukazom nastavite privzeti cilj na graphical.target, kar zažene grafični uporabniški vmesnik:
$ sudo systemctl set-default graphical.targetbashSeznam razpoložljivih destinacij
Če želite prikazati seznam vseh destinacij, ki so na voljo v vašem sistemu, lahko uporabite naslednji ukaz:
$ systemctl list-unit-files --type=targetbashTukaj se prikaže seznam vseh datotek ciljnih enot, nameščenih v vašem sistemu. Za vsako ciljno enoto sta prikazana pot in trenutno stanje (npr. aktivirana ali deaktivirana).
Izolacija ciljev
S isolate lahko hkrati aktivirate vse enote, ki so povezane z določenim ciljem, in zaustavite vse druge enote, ki niso povezane z njim.
Predpostavimo, da delate v okolju z aktivnim graphical.target in želite preiti na čisti večuporabniški način brez grafičnega uporabniškega vmesnika. V tem primeru lahko grafični sistem onemogočite z izolacijo multi-user.target. Ker je graphical.target odvisen od multi-user.target, vendar ne obratno, se ob prehodu ustavijo vse grafične storitve.
Vendar pa morate pred izolacijo cilja preveriti povezane odvisnosti. S tem boste preprečili, da bi se pomembni procesi nenamerno ustavili.
$ systemctl list-dependencies multi-user.targetbashČe ste označili aktivne enote, ki jih želite obdržati, in se z njimi strinjate, lahko izberete želeno destinacijo:
$ sudo systemctl isolate multi-user.targetbashPovezave do pomembnih dogodkov
Za ključne operacije, kot sta zaustavitev ali ponovni zagon sistema, obstajajo posebni ukazi. V sistemu Linux pa sistemctl ponuja tudi praktične bližnjice, ki omogočajo dodatne funkcije. Če želite na primer sistem preklopiti v reševalni način (način za enega uporabnika), lahko namesto isolate rescue.target preprosto uporabite rescue:
$ sudo systemctl rescuebashSistem lahko ustavite s š stop:
$ sudo systemctl stopbashS številko poweroff lahko sprožite popolno izklopitev:
$ sudo systemctl poweroffbashPo drugi strani pa lahko ponovni zagon sprožite s številko reboot:
$ sudo systemctl rebootbashČe ste prijavljeni, vas bodo ti ukazi obvestili o prihajajočih dogodkih. Samo z izvedbo ali izolacijo cilja teh informacij ne boste dobili. Pomembno je vedeti, da mnogi računalniki za pravilno izvedbo teh dejanj povezujejo krajše ukaze s sistemom systemd.
Za ponovni zagon sistema običajno zadostuje naslednja ukazna vrstica:
$ sudo rebootbash