V sistemu Linux ima systemctl osrednjo vlogo pri upra­vlja­nju sistema init in upra­vi­te­lja storitev systemd. S pomočjo systemctl imajo upo­rab­ni­ki nadzor nad sto­ri­tva­mi systemd, njegovimi enotami in na­sta­vi­tva­mi, kar ga naredi ne­po­gre­šlji­vo orodje za sistemsko upra­vlja­nje. Od nadzora zagona do pri­la­ga­ja­nja stanja sistema systemctl ponuja obsežen nabor funkcij.

Kaj je systemctl?

systemctl je orodje za upra­vlja­nje systemd prek ukazne vrstice; systemd je zagonski sistem in sistemski upra­vi­telj za ope­ra­cij­ske sisteme Linux. systemd je danes stan­dar­dni zagonski sistem za številne di­s­tri­bu­ci­je Linuxa in stre­žni­ške di­s­tri­bu­ci­je Linuxa, kot so Ubuntu, Debian, Fedora, Red Hat En­ter­pri­se Linux (RHEL), CentOS, Arch Linux, Mageia in Gentoo. Vendar pa ni vgrajen v vseh di­s­tri­bu­ci­jah.

V sistemu systemd ima systemctl osrednjo vlogo pri upra­vlja­nju sis­tem­skih storitev, kon­fi­gu­ra­ci­ji, načinu zagona in vzdr­že­va­nju sistema. Funk­ci­o­nal­nost tega orodja presega zgolj zagon in za­u­sta­vi­tev storitev. Omogoča celovito upra­vlja­nje skoraj vseh vidikov sistema Linux.

V na­sle­dnjem vodiču boste našli praktične primere kode in ukaze za Linux za uporabo systemctl. Spodnji primeri temeljijo na sistemu Ubuntu 22.04.

Upra­vlja­nje storitev

Glavni namen sistema init je zagon komponent, ki so potrebne po zagonu jedra Linux (kom­po­nen­te upo­rab­ni­ške­ga prostora ). Sistem init se uporablja tudi za učin­ko­vi­to upra­vlja­nje storitev in demonov na strežniku kadarkoli med de­lo­va­njem sistema.

V sistemu systemd se večina procesov osre­do­to­ča na vire, ki jih upravlja sistem. Ti se imenujejo enote. Enote so raz­vr­šče­ne glede na vrsto vira, ki ga pred­sta­vlja­jo, in so opre­de­lje­ne v datotekah enot. Vrsto enote lahko pre­po­zna­te po končnici datoteke.

Pri upra­vlja­nju storitev so pomembne sto­ri­tve­ne enote, ki se končajo s končnico .service. Vendar pa pri ukazih za upra­vlja­nje storitev ta končnica ni vedno potrebna. systemd sam prepozna, da se taki ukazi na splošno nanašajo na storitve.

Zagon in za­u­sta­vi­tev storitev

Ena naj­po­go­stej­ših nalog, ki se v sistemu Linux izvajajo s sis­tem­skim orodjem systemctl, je zagon in za­u­sta­vi­tev storitev. Te funkcije so ključnega pomena za sistemsko ad­mi­ni­stra­ci­jo 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.service
bash

Ker je sistem systemd zasnovan tako, da samodejno išče datoteke .service za ukaze za upra­vlja­nje storitev, lahko ukaz vnesete tudi v po­e­no­sta­vlje­ni obliki:

$ sudo systemctl start application
bash

Če želite na primer zagnati spletni strežnik Apache, vnesite:

$ sudo systemctl start apache2
bash

Če želite ustaviti zagnano storitev, uporabite stop:

$ sudo systemctl stop application.service
bash

Ponovni zagon in ponovno nalaganje

Če želite ponovno zagnati storitev, kar je pogosto potrebno po spremembi na­sta­vi­tev, uporabite ukaz restart:

$ sudo systemctl restart application.service
bash

Če apli­ka­ci­ja lahko ponovno naloži svoje kon­fi­gu­ra­cij­ske datoteke brez ponovnega zagona, lahko za zagon tega postopka uporabite ukaz reload:

$ sudo systemctl reload application.service
bash

Če niste pre­pri­ča­ni, ali storitev omogoča ponovno nalaganje kon­fi­gu­ra­ci­je, lahko uporabite ukaz reload-or-restart. Če je ta možnost podprta, bo ukaz ponovno naložil kon­fi­gu­ra­ci­jo. Če pa ni podprta, bo ukaz ponovno zagnal storitev, da se sproži po­so­do­bi­tev kon­fi­gu­ra­ci­je.

$ sudo systemctl reload-or-restart application.service
bash

Vklop 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 zmo­glji­vost sistema, varnost in upra­vlja­nje od­vi­sno­sti med raz­lič­ni­mi sto­ri­tva­mi. Za na­sta­vi­tev sa­mo­dej­ne­ga zagona ob zagonu sistema uporabite ukaz enable:

$ sudo systemctl enable application.service
bash

Ko se ta postopek izvede, se ustvari sim­bo­lič­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.service
bash

Če želite pre­pre­či­ti, da se storitev samodejno zažene ob zagonu sistema, uporabite disable:

$ sudo systemctl disable application.service
bash

Nato 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 in­for­ma­ci­je o stanju storitev. To je še posebej koristno za spre­mlja­nje in di­a­gno­sti­ci­ra­nje tre­nu­tne­ga stanja sis­tem­skih storitev in storitev aplikacij. Za pre­ver­ja­nje uporabite ukaz status

$ systemctl status application.service
bash

Ta ukaz prikaže vrsto in­for­ma­cij, vključno s trenutnim stanjem storitve (aktivna, neaktivna, okvarjena itd.), zadnjimi iz­ve­de­ni­mi procesi in sporočili dnevnika, hi­e­rar­hi­jo cgroup ter prvimi vrsticami dnevnika.

Za pre­ver­ja­nje tre­nu­tne­ga 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.service
bash

Trenutno 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 na­sta­vlje­na tako, da se samodejno zažene ob zagonu sistema, lahko uporabite ukaz is-enabled. To je še posebej koristno pri upra­vlja­nju na­sta­vi­tev zagona storitev v sistemu Linux.

$ systemctl is-enabled application.service
bash

Ukaz pokaže, ali je storitev ak­ti­vi­ra­na ali de­ak­ti­vi­ra­na, 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.service
bash

Če je izvedba uspešna, se izpiše active. Če pride do napake, se izpiše failed. Če je bila enota namerno usta­vlje­na, 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 pred­sta­vlje­ni ukazi so se osre­do­to­ča­li na upra­vlja­nje po­sa­me­znih storitev. Ti ukazi pa ne ponujajo vpogleda v trenutno stanje sistema. Obstaja vrsta ukazov systemctl, ki lahko za­go­to­vi­jo prav takšne in­for­ma­ci­je.

list-units je koristen za pri­do­bi­tev pregleda nad trenutno na­me­šče­ni­mi paketi v sistemu Linux:

$ systemctl list-units
bash

Ko izvedete ta ukaz, systemctl prikaže seznam enot, ki jih upravlja systemd. Izpis tega seznama vsebuje različne stolpce s po­drob­ni­mi 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-found ali error.
  • ACTIVE: Stanje ak­tiv­no­sti enote, ki se lahko spreminja med načini, kot so active, inactive, activating ali deactivating
  • SUB: Podrejeni status ak­tiv­no­sti, ki daje dodatne po­drob­no­sti o stanju enote (na primer, enota active bi lahko imela status SUB running, exited ali failed).
  • DE­SCRIP­TI­ON: Kratek opis enote, ki pogosto odraža namen ali funk­ci­o­nal­nost 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 in­for­ma­ci­je. Na primer, z uporabo oznake --all se prikažejo vse enote, ki jih je naložil systemd, ne glede na njihov trenutni status ak­tiv­no­sti.

$ systemctl list-units --all
bash

Izpis je mogoče dodatno na­tanč­ne­je pri­la­go­di­ti z uporabo dodatnih oznak, kot je --state=, s katerimi lahko fil­tri­ra­te določene stanje v ka­te­go­ri­jah LOAD, ACTIVE ali SUB. Pomembno je, da ohranite oznako --all, da se prikažejo tudi neaktivne enote:

$ systemctl list-units --all --state=inactive
bash

Uporabite lahko tudi filter --type= za prikaz določenih vrst enot, npr. če želite videti samo enote v aktivni službi:

$ systemctl list-units --type=service
bash

Prikaž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 sto­ri­tva­mi, vtič­ni­ca­mi, cilji in drugimi.

$ systemctl list-units-files
bash

Ta ukaz prikaže različna stanja datotek enot. Ta stanja kažejo, kako so posamezne enote na­sta­vlje­ne, zlasti kar zadeva njihovo delovanje ob zagonu sistema. Naj­po­go­stej­ša stanja so

  • Omogočeno: Naprava je na­sta­vlje­na tako, da se samodejno vklopi ob zagonu sistema.
  • One­mo­go­če­no: Enota ni na­sta­vlje­na za samodejni zagon med zagonom sistema.
  • Zakrita: Enota je popolnoma one­mo­go­če­na, tako da je ni mogoče zagnati niti ročno niti samodejno.
  • Statično: Enota se ne zažene sa­mo­stoj­no, ampak je običajno odvisna od druge enote in se zažene le v tem kontekstu.

Upra­vlja­nje enote

Ena od glavnih nalog sistema systemctl je upra­vlja­nje enot. Systemctl ponuja vrsto uporabnih ukazov in možnosti, ki olaj­šu­je­jo pri­do­bi­va­nje podrobnih in­for­ma­cij o po­sa­me­znih enotah ter njihovo upra­vlja­nje.

Prikaži datoteko enote

Če želite, da se vsebina določene datoteke enote prikaže ne­po­sre­dno v konzoli, lahko uporabite ukaz cat. Če želite na primer pre­gle­da­ti datoteko enote za storitev, kot je ssh.service, vnesite:

$ systemctl cat ssh.service
bash

Prikaži od­vi­sno­sti

Če uporabite list-dependencies, se bodo od­vi­sno­sti določene enote prikazale v drevesni strukturi. Ukaz je takšen:

$ systemctl list-dependencies sshd.service
bash

Praviloma se prikažejo od­vi­sno­sti za .target enot, ki pred­sta­vlja­jo različna stanja sistema. Za popoln, re­kur­zi­ven seznam vseh od­vi­sno­sti uporabite oznako --all.

Če želite prikazati obratne od­vi­sno­sti (tj. enote, ki so odvisne od navedene enote), dodajte k ukazu --reverse. Oznaki --before in —after vam omogočata tudi prikaz od­vi­sno­sti, ki se začnejo pred ali po zadevni enoti.

Enote za pri­kri­va­nje in raz­kri­va­nje

Z ma­ski­ra­njem enote se ta dejansko onemogoči, tako da je ni mogoče zagnati niti ročno niti samodejno. To se pogosto uporablja za za­go­to­vi­tev, da se storitev ali enota ne zažene po nesreči ali samodejno zaradi od­vi­sno­sti. Ma­ski­ra­nje se izvede z ustvar­ja­njem sim­bo­lič­ne povezave ustrezne datoteke enote do /dev/null s pomočjo ukaza mask:

$ sudo systemctl mask nginx.service
bash

Tako je za­go­to­vlje­no, da storitve Nginx ni mogoče zagnati niti ročno niti samodejno, dokler je v zakritem načinu.

Od­stra­ni­tev maske s enote prekliče njen status »maskiran«, tako da jo je mogoče ponovno normalno zagnati. Ukaz za od­stra­ni­tev maske je unmask:

$ sudo systemctl unmask nginx.service
bash

Urejanje datotek enot

systemctl ponuja možnosti za pri­la­ga­ja­nje in spre­mi­nja­nje 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.service
bash

Pri urejanju se ustvari prazna datoteka, v katero se dodajo ali spre­me­ni­jo določena navodila za de­fi­ni­ci­jo 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.service
bash

S pritiskom na --full ko --full se obstoječa datoteka enote odpre v ure­je­val­ni­ku, da jo lahko spre­me­ni­te. Ob zaprtju ure­je­val­ni­ka sistem shrani spre­me­nje­no datoteko v mapo /etc/systemd/system.

Če želite raz­ve­lja­vi­ti spremembe, ki ste jih sami naredili, lahko izbrišete bodisi kon­fi­gu­ra­cij­ski imenik .d naprave bodisi spre­me­nje­no datoteko v /etc/systemd/system:

$ sudo rm -r /etc/systemd/system/nginx.service.d
bash

Popolnoma pre­no­vlje­no datoteko enote lahko izbrišete z na­sle­dnjim ukazom:

$ sudo rm /etc/systemd/system/nginx.service
bash

Po od­stra­ni­tvi 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-reload
bash

Pri­la­ga­ja­nje stanja sistema (stopnja delovanja) s cilji

systemd uporablja predvsem cilje (target) za zdru­že­va­nje različnih enot. To se izvaja z namenom doseganja do­lo­če­ne­ga stanja sistema, podobno kot pri ravneh delovanja (runlevels) v drugih sistemih za zagon. Datoteke s končnico .target delujejo kot ori­en­ta­cij­ske točke, ki kažejo stanje raz­po­lo­žlji­vo­sti določenih funkcij. To upo­rab­ni­kom omogoča, da namesto po­sa­me­znih potrebnih enot določijo želeno splošno stanje.

Praktičen primer je swap.target, ki označuje stanje pri­pra­vlje­no­sti za zamenjavo. Enote, vključene v proces zamenjave, se lahko uskladijo s tem ciljem z uporabo kon­fi­gu­ra­cij­skih možnosti, kot WantedBy= ali RequiredBy=. Enote, ki so odvisne od zamenjave, pa lahko to označijo z na­sta­vi­tva­mi, kot so Wants=, Requires= in After=, da izrazijo svojo odvisnost in vrstni red zagona v zvezi z zamenjavo.

Pri­do­bi­va­nje in na­sta­vi­tev privzete de­sti­na­ci­je

S prikazom in na­sta­vi­tvi­jo pri­vze­te­ga cilja lahko določite privzeto stanje sistema ob zagonu. Tako poiščete privzeti cilj za svoj sistem:

$ systemctl get-default
Output
multi-user.target
bash

Če želite spre­me­ni­ti privzeti cilj, uporabite ukaz set-default skupaj z imenom cilja. Z na­sle­dnjim ukazom nastavite privzeti cilj na graphical.target, kar zažene grafični upo­rab­ni­ški vmesnik:

$ sudo systemctl set-default graphical.target
bash

Seznam raz­po­lo­žlji­vih de­sti­na­cij

Če želite prikazati seznam vseh de­sti­na­cij, ki so na voljo v vašem sistemu, lahko uporabite naslednji ukaz:

$ systemctl list-unit-files --type=target
bash

Tukaj se prikaže seznam vseh datotek ciljnih enot, na­me­šče­nih v vašem sistemu. Za vsako ciljno enoto sta prikazana pot in trenutno stanje (npr. ak­ti­vi­ra­na ali de­ak­ti­vi­ra­na).

Izolacija ciljev

S isolate lahko hkrati ak­ti­vi­ra­te vse enote, ki so povezane z določenim ciljem, in za­u­sta­vi­te vse druge enote, ki niso povezane z njim.

Pred­po­sta­vi­mo, da delate v okolju z aktivnim graphical.target in želite preiti na čisti več­u­po­rab­ni­ški način brez gra­fič­ne­ga upo­rab­ni­ške­ga vmesnika. V tem primeru lahko grafični sistem one­mo­go­či­te 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 od­vi­sno­sti. S tem boste pre­pre­či­li, da bi se pomembni procesi nenamerno ustavili.

$ systemctl list-dependencies multi-user.target
bash

Če ste označili aktivne enote, ki jih želite obdržati, in se z njimi strinjate, lahko izberete želeno de­sti­na­ci­jo:

$ sudo systemctl isolate multi-user.target
bash

Povezave do pomembnih dogodkov

Za ključne operacije, kot sta za­u­sta­vi­tev 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 pre­klo­pi­ti v reševalni način (način za enega upo­rab­ni­ka), lahko namesto isolate rescue.target preprosto uporabite rescue:

$ sudo systemctl rescue
bash

Sistem lahko ustavite s š stop:

$ sudo systemctl stop
bash

S številko poweroff lahko sprožite popolno iz­klo­pi­tev:

$ sudo systemctl poweroff
bash

Po drugi strani pa lahko ponovni zagon sprožite s številko reboot:

$ sudo systemctl reboot
bash

Če ste pri­ja­vlje­ni, vas bodo ti ukazi obvestili o pri­ha­ja­jo­čih dogodkih. Samo z izvedbo ali izolacijo cilja teh in­for­ma­cij ne boste dobili. Pomembno je vedeti, da mnogi ra­ču­nal­ni­ki za pravilno izvedbo teh dejanj po­ve­zu­je­jo krajše ukaze s sistemom systemd.

Za ponovni zagon sistema običajno zadostuje naslednja ukazna vrstica:

$ sudo reboot
bash
Go to Main Menu