Linux vidē komanda systemctl ieņem centrālo lomu init sistēmas un pa­kal­po­ju­mu pār­val­dnie­ka systemd ad­mi­nis­trē­ša­nā. Ar systemctl palīdzību lietotāji var pārvaldīt systemd pa­kal­po­ju­mus, to vienības un kon­fi­gu­rā­ci­jas, tādējādi padarot to par ne­aiz­stā­ja­mu sistēmas ad­mi­nis­trē­ša­nas rīku. No sistēmas pa­lai­ša­nas pār­val­dī­bas līdz sistēmas stāvokļu pie­lā­go­ša­nai — systemctl piedāvā plašu funkciju klāstu.

Kas ir systemctl?

systemctl ir ko­man­drin­das rīks, kas paredzēts systemd pār­val­dī­bai — systemd ir sākuma sistēma un sistēmas pār­vald­nieks Linux ope­rē­tājsis­tē­mām. Pašlaik systemd ir standarta sākuma sistēma vairākās Linux dis­tri­bū­ci­jās un Linux serveru dis­tri­bū­ci­jās, piemēram, Ubuntu, Debian, Fedora, Red Hat En­terpri­se Linux (RHEL), CentOS, Arch Linux, Mageia un Gentoo. Tomēr tā nav vispārēji ieviesta visās dis­tri­bū­ci­jās.

Systemd eko­sis­tē­mā rīkam systemctl ir galvenā loma sistēmas pa­kal­po­ju­mu pār­val­dī­bā, kon­fi­gu­rē­ša­nā, pa­lai­ša­nas procesa vadībā un sistēmas uz­tu­rē­ša­nā. Šī rīka fun­kcio­na­li­tā­te ne­ap­ro­be­žo­jas tikai ar pa­kal­po­ju­mu palaišanu un ap­tu­rē­ša­nu. Tas nodrošina vi­s­ap­tve­ro­šu pār­val­dī­bu gandrīz visos Linux sistēmas aspektos.

Šajā apmācībā at­ra­dī­siet prak­tis­kus koda piemērus un Linux komandas, kas ne­pie­cie­ša­mas, lai izmantotu systemctl. Turpmāk minētie piemēri ir balstīti uz Ubuntu 22.04.

Pa­kal­po­ju­mu pār­val­dī­ba

Init sistēmas galvenais mērķis ir palaist kom­po­nen­tus, kas ne­pie­cie­ša­mi pēc Linux kodola uz­sāk­ša­nas (lietotāja vides kom­po­nen­ti). Init sistēmu izmanto arī, lai efektīvi pār­val­dī­tu pa­kal­po­ju­mus un dēmonus serverī jebkurā sistēmas darbības brīdī.

Sistēmā systemd lielākā daļa procesu ir saistīti ar resursiem, kurus pārvalda sistēma. Tos sauc par vienībām. Šīs vienības tiek kla­si­fi­cē­tas at­bil­sto­ši resursu veidam, ko tās pārstāv, un tiek definētas vienību failos. Vienības veidu var atpazīt pēc faila pa­pla­ši­nā­ju­ma.

Pārvaldot pa­kal­po­ju­mus, svarīgas ir pa­kal­po­ju­mu vienības, kuru nosaukumi beidzas ar piedēkli .service. Tomēr pa­kal­po­ju­mu pār­val­dī­bas komandās ne vienmēr ir ne­pie­cie­šams izmantot šo piedēkli. systemd spēj atpazīt, ka šādas komandas parasti attiecas uz pa­kal­po­ju­miem.

Pa­kal­po­ju­mu sākšana un pār­trauk­ša­na

Viena no visbiežāk vei­ca­ma­jām darbībām Linux sistēmā, iz­man­to­jot systemctl, ir pa­kal­po­ju­mu palaišana un ap­tu­rē­ša­na. Šīs funkcijas ir sistēmas ad­mi­nis­trē­ša­nas pamats un ļauj jums kontrolēt sistēmā dar­bo­jo­šos procesus. Lai palaistu pa­kal­po­ju­mu, iz­man­to­jiet komandu start. Ja strādājat kā lietotājs bez root tiesībām, jums būs jāizmanto sudo.

$ sudo systemctl start application.service
bash

Tā kā systemd ir paredzēts au­to­mā­tis­ki meklēt .service failus pa­kal­po­ju­mu pār­val­dī­bas komandām, komandu var ievadīt arī vien­kār­šo­tā formā:

$ sudo systemctl start application
bash

Piemēram, lai palaistu Apache tīmekļa serveri, jāievada:

$ sudo systemctl start apache2
bash

Ja vēlaties apturēt dar­bo­jo­šos pa­kal­po­ju­mu, iz­man­to­jiet stop:

$ sudo systemctl stop application.service
bash

Pār­star­tēt un at­jau­ni­nāt

Lai pār­star­tē­tu pa­kal­po­ju­mu, kas bieži ir ne­pie­cie­šams pēc kon­fi­gu­rā­ci­jas izmaiņām, iz­man­to­jiet komandu restart:

$ sudo systemctl restart application.service
bash

Ja lie­to­jum­prog­ram­ma spēj at­jau­ni­nāt savus kon­fi­gu­rā­ci­jas failus bez pār­star­tē­ša­nas, šo procesu var uzsākt, iz­man­to­jot komandu reload:

$ sudo systemctl reload application.service
bash

Ja neesat pār­lie­ci­nāts, vai pa­kal­po­jums piedāvā iespēju pārlādēt kon­fi­gu­rā­ci­ju, varat izmantot komandu reload-or-restart. Ja šī iespēja tiek at­bal­stī­ta, kon­fi­gu­rā­ci­ja tiks pārlādēta. Ja tā netiek at­bal­stī­ta, komanda pār­star­tēs pa­kal­po­ju­mu, lai uzsāktu kon­fi­gu­rā­ci­jas at­jau­ni­nā­ša­nu.

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

Pa­kal­po­ju­mu ak­ti­vi­zē­ša­na un deak­ti­vi­zē­ša­na

Ak­ti­vi­zē­jot un deak­ti­vi­zē­jot pa­kal­po­ju­mus, varat noteikt, vai pa­kal­po­jums ir jāpalaiž au­to­mā­tis­ki sistēmas sākšanas brīdī. Tas ir īpaši svarīgi sistēmas veikt­spē­jai, drošībai un atkarību pār­val­dī­bai starp dažādiem pa­kal­po­ju­miem. Lai kon­fi­gu­rē­tu au­to­mā­tis­ko ak­ti­vi­zē­ša­nu sistēmas sākšanas brīdī, iz­man­to­jiet komandu enable:

$ sudo systemctl enable application.service
bash

Veicot šo darbību, tiek izveidota sim­bo­lis­ka saite. Šī saite savieno sistēmas pa­kal­po­ju­ma faila kopiju. Sistēmas pa­kal­po­ju­ma failu parasti var atrast di­rek­to­ri­jā /lib/systemd/system vai /etc/systemd/system. Šeit atrodas arī cietā diska di­rek­to­ri­ja, kurā systemd meklē failus au­to­mā­tis­kai pa­lai­ša­nai. Parasti tas notiek di­rek­to­ri­jā /etc/systemd/system/some_target.target.wants.

$ sudo systemctl enable application.service
bash

Lai pa­kal­po­jums ne­pa­laižtos au­to­mā­tis­ki sistēmas sākšanas laikā, iz­man­to­jiet disable:

$ sudo systemctl disable application.service
bash

Pēc tam tiks dzēsta sim­bo­lis­kā saite, kas nosaka au­to­mā­tis­ku ak­ti­vi­zē­ša­nu sistēmas uz­sāk­ša­nas brīdī.

Uzmanību: Vienkārša pa­kal­po­ju­ma ak­ti­vi­zē­ša­na nenozīmē, ka tas ne­ka­vē­jo­ties sāks darboties pa­šrei­zē­jā sesijā. Lai pa­kal­po­ju­mu sāktu ne­ka­vē­jo­ties un kon­fi­gu­rē­tu tā au­to­mā­tis­ku palaišanu sistēmas uz­sāk­ša­nas brīdī, ir jāizpilda gan start, gan enable komanda.

Pār­bau­diet pa­kal­po­ju­mu statusu

Komanda systemctl ļauj parādīt in­for­mā­ci­ju par pa­kal­po­ju­mu statusu. Tas ir īpaši noderīgi sistēmas un lie­to­jum­prog­ram­mu pa­kal­po­ju­mu pa­šrei­zē­jā statusa uz­rau­dzī­bai un diag­nos­ti­kai. Lai status pārbaudi, iz­man­to­jiet komandu status

$ systemctl status application.service
bash

Šī komanda sniedz dažādu in­for­mā­ci­ju, tostarp pa­kal­po­ju­ma pa­šrei­zē­jo statusu (aktīvs, neaktīvs, ar kļūdu utt.), pēdējos iz­pil­dī­tos procesus un žurnāla ziņojumus, cgroup hie­rar­hi­ju un pirmās žurnāla rindas.

Lai ar komandu systemctl pār­bau­dī­tu pa­kal­po­ju­ma pa­šrei­zē­jo darbības statusu Linux vidē, tiek izmantota komanda is-active. Šī komanda norāda, vai pa­kal­po­jums pašlaik darbojas vai nē:

$ systemctl is-active application.service
bash

Pa­šrei­zē­jais statuss parasti tiek norādīts kā active, ja pa­kal­po­jums ir aktīvs, vai kā inactive, ja pa­kal­po­jums ir neaktīvs.

Lai pār­bau­dī­tu, vai pa­kal­po­jums ir kon­fi­gu­rēts tā, lai au­to­mā­tis­ki tiktu ieslēgts sistēmas uz­sāk­ša­nas brīdī, var izmantot komandu is-enabled. Tas ir īpaši noderīgi, lai pār­val­dī­tu pa­kal­po­ju­mu uz­sāk­ša­nas kon­fi­gu­rā­ci­ju Linux sistēmā.

$ systemctl is-enabled application.service
bash

Komanda norāda, vai pa­kal­po­jums ir ieslēgts vai izslēgts, un at­bil­sto­ši atbildei iestata iziešanas kodu uz „0“ vai „1“.

Varat arī izmantot komandu is-failed, lai pār­bau­dī­tu, vai kon­krē­ta­jam pa­kal­po­ju­mam ir kļūdas statuss:

$ systemctl is-failed application.service
bash

Ja izpilde ir veiksmīga, tiek izvadīts active. Ja rodas kļūda, tiks izvadīts failed. Ja ierīce tika apzināti apturēta, kā atbilde var pa­rā­dī­ties unknown vai inactive. Izvades statuss 0 norāda, ka ir notikusi kļūda, savukārt 1 norāda uz jebkuru citu statusu.

Sistēmas stāvoklis

Līdz šim ap­rak­stī­tās komandas bija vērstas uz atsevišķu pa­kal­po­ju­mu pār­val­dī­bu. Tomēr šīs komandas nesniedz ieskatu sistēmas pa­šrei­zē­jā stāvoklī. Ir virkne systemctl komandu, kas var sniegt tieši šādu in­for­mā­ci­ju.

Komandalist-units ir noderīga, lai iegūtu pārskatu par pa­šrei­zē­jiem resursiem Linux sistēmā:

$ systemctl list-units
bash

Kad izpildāt šo komandu, systemctl parāda sarakstu ar vienībām, kuras pārvalda systemd. Šī saraksta izvade satur dažādas ailes ar konkrētu in­for­mā­ci­ju par katru vienību. Tiek parādītas šādas ailes:

  • UNIT: Vienības nosaukums (to bieži ņem no vienības faila nosaukuma, piemēram, sshd.service SSH dēmonam)
  • LOAD: Norāda, vai vienības fails tika veiksmīgi ielādēts; ie­spē­ja­mās vērtības ir loaded, not-found vai error.
  • ACTIVE: Vienības darbības statuss, kas var mainīties starp režīmiem, piemēram, active, inactive, activating vai deactivating
  • SUB: Pa­kār­to­tais darbības statuss, kas sniedz sīkāku in­for­mā­ci­ju par vienības stāvokli (piemēram, vienībai active SUB statuss var būt running, exited vai failed)
  • DESCRIP­TION: Vienības īss apraksts, kas bieži atspoguļo vienības mērķi vai fun­kcio­na­li­tā­ti

Tomēr pēc no­klu­sē­ju­ma šī komanda parāda tikai aktīvās vienības. Tāpēc izvades ailē „LOAD“ parasti redzams loaded, bet ailē „ACTIVE“ — active. Iz­man­to­jot papildu pa­ra­met­rus, komandu „systemctl“ var kon­fi­gu­rēt tā, lai tā parādītu arī papildu in­for­mā­ci­ju. Piemēram, iz­man­to­jot parametru --all, tiks parādītas visas vienības, kuras ir ielādējis „systemd“, ne­at­ka­rī­gi no to pa­šrei­zē­jā darbības statusa.

$ systemctl list-units --all
bash

Re­zul­tā­tus var vēl vairāk precizēt, iz­man­to­jot papildu ka­ro­dzi­ņus, piemēram, --state=, lai atlasītu konkrētas vienības ka­te­go­ri­jās „LOAD”, „ACTIVE” vai „SUB”. Ir svarīgi saglabāt karodziņu --all, lai tiktu parādītas arī neaktīvās vienības:

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

Varat izmantot arī filtru --type=, lai parādītu konkrētu veidu vienības, piemēram, ja vēlaties redzēt tikai aktīvā dienestā esošās vienības:

$ systemctl list-units --type=service
bash

Uzskaitīt visus vienību failus

Lai ar komandu systemctl parādītu visu vienību failu sarakstu Linux vidē (ieskaitot tos, kurus systemd nav mēģinājis ielādēt), varat izmantot list-unit-files. Šī komanda parāda visus vienību failus, par kuriem systemd ir informēts, tostarp pa­kal­po­ju­mus, soketus, mērķus un citus.

$ systemctl list-units-files
bash

Šī komanda parāda dažādus vienību failu statusus. Šie statusi norāda, kā at­tie­cī­gās vienības ir kon­fi­gu­rē­tas, jo īpaši saistībā ar to darbību sistēmas uz­sāk­ša­nas brīdī. Visbiežāk sa­sto­pa­mie statusi ir

  • Ieslēgts: Ierīce ir kon­fi­gu­rē­ta tā, lai au­to­mā­tis­ki ieslēgtos sistēmas uz­sāk­ša­nas brīdī.
  • Atspējots: Ierīce nav kon­fi­gu­rē­ta au­to­mā­tis­kai pa­lai­ša­nai sistēmas uz­sāk­ša­nas procesa laikā.
  • Maskēts: Vienība ir pilnībā deak­ti­vi­zē­ta, tāpēc to nevar palaist ne manuāli, ne au­to­mā­tis­ki.
  • Statiska: Vienība netiek palaista ne­at­ka­rī­gi, bet parasti ir atkarīga no citas vienības un tiek palaista tikai šajā kontekstā.

Vienības vadība

Viena no gal­ve­na­jām systemctl funkcijām ir vienību pār­val­dī­ba. systemctl piedāvā virkni noderīgu komandu un opciju, kas atvieglo konkrētas in­for­mā­ci­jas iegūšanu par at­se­viš­ķām vienībām un to pār­val­dī­bu.

Parādīt vienības failu

Ja vēlaties, lai konkrēta vienības faila saturs tiktu parādīts tieši konsolē, varat izmantot komandu cat. Piemēram, lai apskatītu tāda pa­kal­po­ju­ma kā ssh.service vienības failu, ievadiet:

$ systemctl cat ssh.service
bash

Rādīt atkarības

Ja iz­man­to­jat list-dependencies, konkrētās vienības atkarības tiks attēlotas koka struktūrā. Komanda izskatās šādi:

$ systemctl list-dependencies sshd.service
bash

Parasti tiek parādītas atkarības .target vienībai, kas atspoguļo dažādus sistēmas stāvokļus. Lai iegūtu pilnīgu, rekursīvu visu atkarību sarakstu, iz­man­to­jiet --all opciju.

Lai parādītu at­grie­ze­nis­kās atkarības (t. i., vienības, kas ir atkarīgas no norādītās vienības), komandai pie­vie­no­jiet --reverse. Ar opcijām --before un —after varat arī apskatīt atkarības, kas sākas pirms vai pēc at­tie­cī­gās vienības.

Vienību maskēšana un de­mas­kē­ša­na

Vienības maskēšana faktiski to atslēdz, tādējādi neļaujot to palaist ne manuāli, ne au­to­mā­tis­ki. To bieži izmanto, lai no­dro­ši­nā­tu, ka pa­kal­po­jums vai vienība netiek palaista nejauši vai au­to­mā­tis­ki atkarību dēļ. Maskēšanu veic, iz­vei­do­jot sim­bo­lis­ku saiti no attiecīgā vienības faila uz /dev/null, iz­man­to­jot komandu mask:

$ sudo systemctl mask nginx.service
bash

Tas nodrošina, ka Nginx pa­kal­po­ju­mu nevar sākt ne manuāli, ne au­to­mā­tis­ki, kamēr tas darbojas maskētajā režīmā.

At­mas­ko­ša­na atceļ vienības maskēto statusu, lai to varētu atkal palaist parastā režīmā. Komanda at­mas­ko­ša­nai ir unmask:

$ sudo systemctl unmask nginx.service
bash

Vienību failu re­di­ģē­ša­na

Komandai systemctl ir pieejamas opcijas vienību failu pie­lā­go­ša­nai un re­di­ģē­ša­nai. Šīs funkcijas tika ieviestas ar systemd 218. versiju. Ja iz­man­to­jat komandu edit, izvēlētās vienības failu au­to­mā­tis­ki atver re­di­ģē­ša­nai:

$ sudo systemctl edit nginx.service
bash

Rediģējot tiek izveidots tukšs fails, lai pie­vie­no­tu vai mainītu konkrētas ins­truk­ci­jas vienības de­fi­nī­ci­jā. Katrai vienībai (piem., nginx.service) di­rek­to­ri­jā /etc/systemd/system tiek izveidota apakšmape, kuras no­sau­ku­mam pievieno pa­pla­ši­nā­ju­mu .d. Iepriekš minētajā piemērā apakšmape būtu nginx.service.d.

Šajā apakšmapē tiek izveidots failu override.conf. Kad systemd ielādē vienību, tas apvieno šī fragmenta faila saturu ar sākotnējo vienības failu. Šajā gadījumā fragmenta norādēm ir prio­ri­tā­te. Lai ap­strā­dā­tu visu vienības failu, var izmantot --full karodziņu:

$ sudo systemctl edit --full nginx.service
bash

Nospiežot --full, esošais vienības fails tiek atvērts redaktorā, lai veiktu izmaiņas. Izietot no redaktora, sistēma saglabā rediģēto failu mapē /etc/systemd/system.

Lai atceltu paša veiktās izmaiņas, varat vai nu izdzēst ierīces kon­fi­gu­rā­ci­jas di­rek­to­ri­ju .d, vai arī izdzēst mo­di­fi­cē­to failu /etc/systemd/system:

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

Pilnībā pār­strā­dā­tu vienības failu var dzēst, iz­man­to­jot šādu komandu:

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

Pēc faila vai di­rek­to­ri­ja iz­dzē­ša­nas būs ne­pie­cie­šams pār­star­tēt systemd, lai tas vairs ne­at­sauk­tos uz iz­dzēs­ta­jiem failiem, bet gan izmantotu sistēmas pašu kopiju:

$ sudo systemctl daemon-reload
bash

Sistēmas stāvokļa (darba līmeņa) pie­lā­go­ša­na, iz­man­to­jot mērķus

systemd gal­ve­no­kārt izmanto mērķus (target), lai grupētu dažādas vienības. Tas tiek darīts, lai panāktu konkrētu sistēmas stāvokli, līdzīgi kā darbības līmeņi citās init sistēmās. Faili ar pa­pla­ši­nā­ju­mu .target darbojas kā orien­tie­ri, kas norāda uz noteiktu funkciju pie­eja­mī­bas statusu. Tas ļauj lie­to­tā­jiem norādīt vēlamo kopējo stāvokli, nevis at­se­viš­ķas ne­pie­cie­ša­mās vienības.

Praktisks piemērs ir swap.target, kas norāda uz gatavību apmaiņai. Vienības, kas ie­sais­tī­tas apmaiņas procesā, var pie­lā­go­ties šim mērķim, iz­man­to­jot kon­fi­gu­rā­ci­jas opcijas, piemēram, WantedBy= vai RequiredBy=. Savukārt vienības, kas ir atkarīgas no apmaiņas, var to norādīt, iz­man­to­jot tādus ie­sta­tī­ju­mus kā Wants=, Requires= un After=, lai izteiktu savu atkarību un sākuma secību saistībā ar apmaiņu.

Ielādēt un iestatīt no­klu­sē­ju­ma galamērķi

No­klu­sē­ju­ma mērķa iz­sauk­ša­na un kon­fi­gu­rē­ša­na ļauj definēt sistēmas no­klu­sē­ju­ma stāvokli sistēmas uz­sāk­ša­nas brīdī. Šādi varat atrast sistēmas no­klu­sē­ju­ma mērķi:

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

Ja vēlaties mainīt no­klu­sē­ju­ma mērķi, iz­man­to­jiet komandu set-default kopā ar mērķa nosaukumu. Lai no­klu­sē­ju­ma mērķi iestatītu uz graphical.target, kas palaista grafisko lietotāja saskarni, iz­man­to­jiet šādu komandu:

$ sudo systemctl set-default graphical.target
bash

Saraksts ar pie­eja­ma­jiem ga­la­mēr­ķiem

Lai parādītu visus sistēmā pieejamos ga­la­mēr­ķus, varat izmantot šādu komandu:

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

Tiek parādīts saraksts ar visiem sistēmā in­sta­lē­ta­jiem mērķa vienību failiem. Katram mērķim tiek parādīts ceļš un pa­šrei­zē­jais statuss (piemēram, ak­ti­vi­zēts vai deak­ti­vi­zēts).

Izolēt mērķus

Iz­man­to­jot isolate, var vien­lai­kus aktivizēt visas vienības, kas ir saistītas ar konkrētu mērķi, un apturēt visas pārējās vienības, kas ar to nav saistītas.

Pieņemsim, ka jūs strādājat vidē, kurā darbojas graphical.target, un vēlaties pāriet uz tīru daudzlie­to­tā­ju režīmu bez grafiskās lietotāja saskarnes. Šajā gadījumā varat atslēgt grafisko sistēmu, izolējot multi-user.target. Tā kā graphical.target ir atkarīgs no multi-user.target, bet ne otrādi, pārejas brīdī visi grafiskie pa­kal­po­ju­mi tiek apturēti.

Tomēr pirms mērķa iz­olē­ša­nas vajadzētu pārbaudīt saistītās atkarības. Tas novērsīs svarīgu procesu nejaušu pār­trauk­ša­nu.

$ systemctl list-dependencies multi-user.target
bash

Ja esat at­zī­mē­ju­ši aktīvās vienības, kuras vēlaties saglabāt, un piekrītat to izvēlei, varat norādīt vēlamo galamērķi:

$ sudo systemctl isolate multi-user.target
bash

Saīsnes svarīgiem no­ti­ku­miem

Ir noteikti mērķi tādiem būtiskiem darbības posmiem kā sistēmas iz­slēg­ša­na vai atkārtota palaišana. Tomēr Linux vidē komanda systemctl piedāvā arī prak­tis­kus saīsnes, kas nodrošina papildu funkcijas. Piemēram, lai sistēmu pārslēgtu glābšanas režīmā (viena lietotāja režīmā), var vienkārši izmantot rescue vietā isolate rescue.target:

$ sudo systemctl rescue
bash

Sistēmu var apturēt, nospiežot stop:

$ sudo systemctl stop
bash

Ar poweroff varat uzsākt pilnīgu iz­slēg­ša­nu:

$ sudo systemctl poweroff
bash

No otras puses, varat uzsākt pār­star­tē­ša­nu, ievadot reboot:

$ sudo systemctl reboot
bash

Ja esat pie­tei­cies, šīs komandas sniegs in­for­mā­ci­ju par gai­dā­ma­jiem no­ti­ku­miem. Vienkārša mērķa izpilde vai izolēšana šo in­for­mā­ci­ju nesniegs. Ir svarīgi zināt, ka daudzi datori šīm darbībām pa­re­dzē­tās īsākās komandas saista ar systemd, lai no­dro­ši­nā­tu pareizu izpildi.

Lai pār­star­tē­tu sistēmu, parasti pietiek ar šādu komandu:

$ sudo reboot
bash
Go to Main Menu