# 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](https://www.ionos.com/sl-si/digitalguide/streznik/nastavitve/linux-ukazi-pregled-ukazov-v-terminalu/) 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`.

```bash
$ sudo systemctl start application.service
```

Ker je sistem systemd zasnovan tako, da samodejno išče datoteke *.service* za ukaze za upravljanje storitev, lahko ukaz vnesete tudi v poenostavljeni obliki:

```bash
$ sudo systemctl start application
```

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

```bash
$ sudo systemctl start apache2
```

Če želite ustaviti zagnano storitev, uporabite `stop`:

```bash
$ sudo systemctl stop application.service
```

### Ponovni zagon in ponovno nalaganje

Če želite ponovno zagnati storitev, kar je pogosto potrebno po spremembi nastavitev, uporabite ukaz `restart`:

```bash
$ sudo systemctl restart application.service
```

Če aplikacija lahko ponovno naloži svoje **konfiguracijske datoteke brez ponovnega zagona**, lahko za zagon tega postopka uporabite ukaz `reload`:

```bash
$ sudo systemctl reload application.service
```

Č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.

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

### 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 zmogljivost sistema, varnost in upravljanje odvisnosti med različnimi storitvami. Za nastavitev samodejnega zagona ob zagonu sistema uporabite ukaz `enable`:

```bash
$ sudo systemctl enable application.service
```

Ko 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*.

```bash
$ sudo systemctl enable application.service
```

Če želite preprečiti, da se storitev samodejno zažene ob zagonu sistema, uporabite `disable`:

```bash
$ sudo systemctl disable application.service
```

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 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`

```bash
$ systemctl status application.service
```

Ta 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:

```bash
$ systemctl is-active application.service
```

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 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.

```bash
$ systemctl is-enabled application.service
```

Ukaz 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**:

```bash
$ systemctl is-failed application.service
```

Č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:

```bash
$ systemctl list-units
```

Ko 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-found` ali `error`.
- **ACTIVE**: Stanje aktivnosti enote, ki se lahko spreminja med načini, kot so `active`, `inactive`, `activating` ali `deactivating`
- **SUB**: Podrejeni status aktivnosti, ki daje dodatne podrobnosti o stanju enote (na primer, enota `active` bi lahko imela status SUB `running`, `exited` ali `failed`).
- **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.

```bash
$ systemctl list-units --all
```

Izpis 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:

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

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

```bash
$ systemctl list-units --type=service
```

### 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 storitvami, vtičnicami, cilji in drugimi.

```bash
$ systemctl list-units-files
```

Ta 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:

```bash
$ systemctl cat ssh.service
```

### Prikaži odvisnosti

Če uporabite `list-dependencies`, se bodo odvisnosti določene enote prikazale v drevesni strukturi. Ukaz je takšen:

```bash
$ systemctl list-dependencies sshd.service
```

Praviloma 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`:

```bash
$ sudo systemctl mask nginx.service
```

Tako 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`:

```bash
$ sudo systemctl unmask nginx.service
```

## Urejanje 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:

```bash
$ sudo systemctl edit nginx.service
```

Pri 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`:

```bash
$ sudo systemctl edit --full nginx.service
```

S 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`:

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

Popolnoma prenovljeno datoteko enote lahko izbrišete z naslednjim ukazom:

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

Po odstranitvi datoteke ali mape boste morali ponovno zagnati systemd, da ne bo več skliceval na izbrisane datoteke, temveč bo ponovno uporabil sistemsko kopijo:

```bash
$ sudo systemctl daemon-reload
```

## Prilagajanje 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:

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

Č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:

```bash
$ sudo systemctl set-default graphical.target
```

### Seznam razpoložljivih destinacij

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

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

Tukaj 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.

```bash
$ systemctl list-dependencies multi-user.target
```

Če ste označili aktivne enote, ki jih želite obdržati, in se z njimi strinjate, lahko izberete želeno destinacijo:

```bash
$ sudo systemctl isolate multi-user.target
```

### Povezave 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`:

```bash
$ sudo systemctl rescue
```

Sistem lahko ustavite s š `stop`:

```bash
$ sudo systemctl stop
```

S številko `poweroff` lahko sprožite popolno izklopitev:

```bash
$ sudo systemctl poweroff
```

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

```bash
$ sudo systemctl reboot
```

Č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:

```bash
$ sudo reboot
```


This is a markdown version of: [https://www.ionos.com/sl-si/digitalguide/streznik/nastavitve/systemctl/](https://www.ionos.com/sl-si/digitalguide/streznik/nastavitve/systemctl/) for AI/LLM consumption.