# Kuinka hallita palveluita ja yksiköitä systemctl-komennolla

Linuxissa systemctl:llä on keskeinen rooli init-järjestelmän ja palvelunhallintaohjelman systemd:n hallinnassa. Systemctl:n avulla käyttäjät voivat hallita systemd-palveluita, niiden yksiköitä ja asetuksia, mikä tekee siitä järjestelmänhallinnan kannalta välttämättömän työkalun. Käynnistyksen hallinnasta järjestelmän tilojen mukauttamiseen – systemctl tarjoaa kattavan valikoiman toimintoja.

## Mikä on systemctl?

systemctl on komentorivityökalu, jolla hallitaan **systemd:tä**, joka on Linux-käyttöjärjestelmien käynnistysjärjestelmä ja järjestelmänhallintaohjelma. systemd on nykyään vakiokäynnistysjärjestelmä useissa Linux-jakeluissa ja Linux-palvelinjakeluissa, kuten Ubuntu, Debian, Fedora, Red Hat Enterprise Linux (RHEL), CentOS, Arch Linux, Mageia ja Gentoo. Sitä ei kuitenkaan ole otettu käyttöön kaikissa jakeluissa.

Systemd-ekosysteemissä systemctl:llä on **keskeinen rooli järjestelmäpalveluiden hallinnassa, määrityksissä, käynnistyskäyttäytymisessä ja järjestelmän ylläpidossa**. Työkalun toiminnallisuus ulottuu pelkkää palveluiden käynnistämistä ja pysäyttämistä pidemmälle. Se tarjoaa kattavan hallinnan lähes kaikkiin Linux-järjestelmän osa-alueisiin.

Seuraavassa oppaassa on käytännön koodiesimerkkejä ja [Linux-komentoja](https://www.ionos.com/fi-fi/digitalguide/palvelin/asetukset/linux-komennot-katsaus-terminaalikomennoihin/) systemctl:n käyttöön. Alla olevat esimerkit perustuvat \*\*Ubuntu 22.04:\*\*ään.

## Palvelunhallinta

Init-järjestelmän ensisijaisena tavoitteena on käynnistää Linux-ytimen käynnistymisen jälkeen tarvittavat komponentit (käyttöjärjestelmän komponentit). Init-järjestelmää käytetään myös palvelimella olevien palveluiden ja taustaprosessien tehokkaaseen hallintaan milloin tahansa järjestelmän käynnin aikana.

Systemd-ympäristössä suurin osa prosesseista keskittyy järjestelmän hallinnoimiin resursseihin. Näitä kutsutaan **yksiköiksi**. Yksiköt luokitellaan niiden edustaman resurssin tyypin mukaan, ja ne määritellään yksikkötiedostoissa. Yksikön tyypin tunnistaa tiedostotunnisteesta.

Palveluita hallittaessa ovat tärkeässä asemassa palveluyksiköt, joiden nimi päättyy päätteeseen *.service.* Tätä päätettä ei kuitenkaan aina tarvitse käyttää palvelujen hallintakomennoissa. systemd tunnistaa, että tällaiset komennot viittaavat yleensä palveluihin.

### Palveluiden käynnistäminen ja pysäyttäminen

Yksi yleisimmistä tehtävistä, joita Linuxissa suoritetaan systemctl-komennolla, on palvelujen käynnistäminen ja pysäyttäminen. Nämä toiminnot ovat järjestelmänhallinnan perusta, ja niiden avulla voit hallita järjestelmässä käynnissä olevia prosesseja. Palvelun käynnistämiseen käytetään komentoa `start`. Jos työskentelet käyttäjänä, jolla ei ole pääkäyttäjän oikeuksia, sinun on käytettävä `sudo`.

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

Koska systemd on suunniteltu etsimään palvelunhallintakomentoja varten automaattisesti *.service-t* iedostoja *,* komento voidaan kirjoittaa myös yksinkertaistetussa muodossa:

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

Esimerkiksi Apache-verkkopalvelimen käynnistämiseksi kirjoitat:

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

Jos haluat pysäyttää käynnissä olevan palvelun, käytä `stop`:

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

### Käynnistä uudelleen ja lataa uudelleen

Jos haluat käynnistää palvelun uudelleen – mikä on usein tarpeen asetusten muutoksen jälkeen – käytä komentoa `restart`:

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

Jos sovellus pystyy lataamaan **asetustiedostonsa** uudelleen **käynnistämättä sitä uudelleen**, prosessi voidaan käynnistää `reload` -komennolla:

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

Jos et ole varma, tarjoaako palvelu mahdollisuutta ladata asetukset uudelleen, voit käyttää komentoa `reload-or-restart`. Tämä lataa asetukset uudelleen, jos tämä toiminto on tuettu. Jos sitä ei tueta, komento käynnistää palvelun uudelleen asetusten päivittämisen aloittamiseksi.

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

### Palveluiden käyttöönotto ja käytöstä poistaminen

Palveluita aktivoimalla ja deaktivoimalla voit määrittää, käynnistyykö palvelu automaattisesti järjestelmän käynnistyessä. Tämä on erityisen tärkeää järjestelmän suorituskyvyn, tietoturvan ja eri palveluiden välisten riippuvuussuhteiden hallinnan kannalta. Määritä automaattinen käynnistys järjestelmän käynnistyksen yhteydessä `enable`:

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

Kun tämä prosessi suoritetaan, luodaan symbolinen linkki. Tämä linkki yhdistää järjestelmäpalvelutiedoston kopion. Järjestelmäpalvelutiedosto sijaitsee yleensä hakemistossa */lib/systemd/system* tai */etc/systemd/system*. Täältä löydät myös kiintolevyllä olevan hakemiston, josta systemd etsii automaattisen käynnistyksen tiedostoja. Tämä tapahtuu yleensä hakemistossa */etc/systemd/system/some\_target.target.wants*.

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

Jos haluat estää palvelun käynnistymisen automaattisesti järjestelmän käynnistyessä, käytä `disable`:

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

Tämän jälkeen symbolinen linkki, joka määrittää automaattisen käynnistymisen järjestelmän käynnistyessä, poistetaan.

**Huomio**: Pelkkä palvelun aktivointi ei käynnistä sitä välittömästi nykyisessä istunnossa. Jos haluat käynnistää palvelun välittömästi ja määrittää sen käynnistymään automaattisesti järjestelmän käynnistyessä, sinun on **suoritettava sekä** komento `start` että komento `enable`.

### Tarkista palvelujen tila

systemctl-komennolla voidaan näyttää tietoja palveluiden tilasta. Tämä on erityisen hyödyllistä järjestelmä- ja sovelluspalveluiden nykyisen tilan seurannassa ja vianmäärityksessä. Käytä tarkistukseen komentoa `status`:

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

Tämä komento tarjoaa monenlaista tietoa, kuten palvelun nykyisen tilan (aktiivinen, passiivinen, viallinen jne.), viimeksi suoritetut prosessit ja lokiviestit, cgroup-hierarkian sekä ensimmäiset lokirivit.

Linuxissa palvelun nykyisen tilan tarkistamiseen systemctl-komennolla käytetään `is-active`. Tämä komento kertoo, onko palvelu tällä hetkellä aktiivinen vai ei:

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

Nykyinen tila määritetään yleensä arvoksi `active`, jos palvelu on aktiivinen, tai arvoksi `inactive`, jos palvelu on passiivinen.

Voit tarkistaa, onko palvelu määritetty käynnistymään automaattisesti järjestelmän käynnistyksen yhteydessä, käyttämällä `is-enabled`. Tämä on erityisen hyödyllistä palvelujen käynnistysasetusten hallinnassa Linux-järjestelmässä.

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

Komento ilmoittaa, onko palvelu käytössä vai pois käytöstä, ja asettaa vastauksen perusteella poistumiskoodiksi joko ”0” tai ”1”.

Voit myös käyttää komentoa `is-failed` tarkistaaksesi, **onko** tietyllä **palvelulla virhetila**:

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

Jos suoritus onnistuu, tuloksena on `active`. Jos tapahtuu virhe, tulos on `failed`. Jos laite on pysäytetty tarkoituksella, vastauksena voi näkyä `unknown` tai `inactive`. Lopetustila `0` tarkoittaa, että on tapahtunut virhe, kun taas `1` tarkoittaa mitä tahansa muuta tilaa.

## Järjestelmän tila

Tähän mennessä esitellyt komennot ovat keskittyneet yksittäisten palveluiden hallintaan. Nämä komennot eivät kuitenkaan anna tietoa järjestelmän nykytilasta. On olemassa useita systemctl-komentoja, jotka tarjoavat juuri tällaista tietoa.

`list-units` on hyödyllinen, kun halutaan saada yleiskuva Linuxin nykyisistä yksiköistä:

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

Kun suoritat tämän komennon, systemctl näyttää luettelon systemd:n hallinnoimista yksiköistä. Luettelon tulosteessa on useita sarakkeita, jotka sisältävät tarkempia tietoja kustakin yksiköstä. Seuraavat sarakkeet näkyvät:

- **UNIT**: Yksikön nimi (tämä otetaan usein yksikön tiedostonimestä, esim. *sshd.service* SSH-palvelimelle)
- **LOAD**: Ilmaisee, onko yksikkötiedosto ladattu onnistuneesti; mahdolliset arvot ovat `loaded`, `not-found` tai `error`.
- **ACTIVE**: Yksikön aktiivisuustila, joka voi vaihdella tilojen välillä, kuten `active`, `inactive`, `activating` tai `deactivating`
- **SUB**: Alainen aktiivisuustila, joka antaa lisätietoja yksikön tilasta (esimerkiksi yksiköllä `active` voi olla SUB-tila `running`, `exited` tai `failed`).
- **DESCRIPTION**: Lyhyt kuvaus yksiköstä, joka usein kuvaa yksikön tarkoitusta tai toiminnallisuutta

Komento **näyttää** kuitenkin oletuksena **vain aktiiviset yksiköt**. Tästä syystä tulosteen LOAD-sarakkeessa näkyy yleensä `loaded` ja ACTIVE-sarakkeessa `active`. Lisäparametreilla systemctl voidaan määrittää näyttämään myös muita tietoja. Esimerkiksi parametrilla `--all` näytetään kaikki systemd:n lataamat yksiköt niiden nykyisestä aktiivisuustilasta riippumatta.

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

Tulosta voidaan tarkentaa edelleen käyttämällä lisämerkkejä, kuten `--state=`, joilla suodatetaan tiettyjä tiloja LOAD-, ACTIVE- tai SUB-luokista. On tärkeää säilyttää merkki `--all`, jotta myös passiiviset yksiköt tulevat näkyviin:

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

Voit myös käyttää suodatinta `--type=` tiettyjen yksikkötyyppien näyttämiseen, esimerkiksi jos haluat nähdä vain aktiivipalveluksessa olevat yksiköt:

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

### Luettele kaikki yksikkötiedostot

Jos haluat näyttää luettelon kaikista Linuxin yksikkötiedostoista systemctl-komennolla (mukaan lukien ne, joita systemd ei ole yrittänyt ladata), voit käyttää `list-unit-files`. Tämä komento näyttää kaikki yksikkötiedostot, jotka systemd tunnistaa, mukaan lukien palvelut, socketit, kohteet ja muut.

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

Komento näyttää yksikkötiedostojen eri tilat. Nämä tilat kertovat, miten kyseiset yksiköt on määritetty, erityisesti niiden käyttäytymisen osalta järjestelmän käynnistyksen yhteydessä. Yleisimmät tilat ovat

- **Käytössä**: Laite on määritetty käynnistymään automaattisesti järjestelmän käynnistyksen yhteydessä.
- **Pois käytöstä**: Laitetta ei ole määritetty käynnistymään automaattisesti käynnistysprosessin aikana.
- **Piilotettu**: Laite on täysin pois käytöstä, joten sitä ei voi käynnistää manuaalisesti tai automaattisesti.
- **Staattinen**: Yksikköä ei käynnistetä itsenäisesti, vaan se riippuu yleensä toisesta yksiköstä ja käynnistyy vain tässä yhteydessä.

## Yksikön johto

Yksi systemctl:n päätehtävistä on yksiköiden hallinta. systemctl tarjoaa joukon hyödyllisiä komentoja ja vaihtoehtoja, joiden avulla on helpompi saada tarkkoja tietoja yksittäisistä yksiköistä ja hallita niitä.

### Näytä yksikkötiedosto

Jos haluat, että tietyn yksikkötiedoston sisältö näkyy suoraan konsolissa, voit käyttää komentoa `cat`. Jos haluat esimerkiksi tarkastella palvelun, kuten *ssh.service*, yksikkötiedostoa, kirjoita:

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

### Näytä riippuvuudet

Jos käytät `list-dependencies`, tietyn yksikön riippuvuudet näytetään puurakenteena. Komento näyttää tältä:

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

Oletuksena näytetään `.target` yksikön riippuvuudet, jotka edustavat järjestelmän eri tiloja. Käytä lippua `--all`, jos haluat täydellisen, rekursiivisen luettelon kaikista riippuvuuksista.

Jos haluat näyttää käänteiset riippuvuudet (eli yksiköt, jotka riippuvat määritetystä yksiköstä), lisää komentoon `--reverse`. Lippujen `--before` ja `—after` avulla voit myös tarkastella riippuvuuksia, jotka alkavat ennen kyseistä yksikköä tai sen jälkeen.

### Yksiköiden peittäminen ja peitteen poistaminen

Yksikön peittäminen poistaa sen käytöstä niin, ettei sitä voi käynnistää manuaalisesti tai automaattisesti. Tätä käytetään usein varmistamaan, ettei palvelua tai yksikköä käynnistetä vahingossa tai automaattisesti riippuvuuksien vuoksi. Peittäminen tapahtuu luomalla kyseisen yksikön tiedostosta symbolinen linkki tiedostoon `/dev/null` komennolla `mask`:

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

Tämä varmistaa, että Nginx-palvelua ei voida käynnistää manuaalisesti tai automaattisesti, kun se on piilotetussa tilassa.

Peitteen poistaminen poistaa yksikön peitetyn tilan, jolloin se voidaan käynnistää uudelleen normaalisti. Peitteen poistamiseen käytettävä komento on `unmask`:

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

## Yksikkötiedostojen muokkaus

systemctl:ssä on toimintoja yksikkötiedostojen mukauttamiseen ja muokkaamiseen. Nämä toiminnot otettiin käyttöön systemd-versiossa 218. Jos käytät komentoa `edit`, valitun yksikön yksikkötiedosto avautuu automaattisesti muokattavaksi:

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

Muokkaamisen yhteydessä luodaan tyhjä tiedosto, johon voidaan lisätä tai muuttaa yksikkömäärittelyn ohjeita. Jokaiselle yksikölle (esim. `nginx.service`) luodaan */etc/systemd/system-hakemistoon* alihakemisto, jonka tiedostonimeen lisätään *loppuliite .d*. Edellä olevassa esimerkissä alihakemisto olisi *nginx.service.d*.

Tähän alikansioon luodaan *override.conf-tiedosto*. Kun systemd lataa yksikön, se yhdistää tämän pätkätiedoston sisällön alkuperäiseen yksikkötiedostoon. Tällöin pätkän ohjeilla on etusija. Koko yksikkötiedoston käsittelyyn voidaan käyttää lippua `--full`:

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

Painamalla `--full` avaat olemassa olevan yksikkötiedoston editorissa muokattavaksi. Kun poistut editorista, järjestelmä tallentaa muokatun tiedoston kansioon */etc/systemd/system*.

Jos haluat kumota itse tekemäsi muutokset, voit joko poistaa laitteen asetuskansion `.d` tai muokatun tiedoston kohdasta `/etc/systemd/system`:

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

Täysin uudistettu yksikkötiedosto voidaan poistaa seuraavalla komennolla:

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

Kun olet poistanut tiedoston tai kansion, sinun on ladattava systemd uudelleen, jotta se lakkaa viittaamasta poistettuihin tiedostoihin ja siirtyy käyttämään järjestelmän omaa kopiota:

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

## Järjestelmän tilan (käyttötason) säätäminen tavoitteiden avulla

systemd käyttää ensisijaisesti kohteita (target) eri yksiköiden ryhmittelemiseen. Tällä pyritään saavuttamaan tietty järjestelmän tila, samalla tavalla kuin muiden käynnistysjärjestelmien ajotasot. Tiedostot, joiden tiedostotunniste `.target`, toimivat suuntaviivoina, jotka ilmaisevat tiettyjen toimintojen saatavuustilan. Näin käyttäjät voivat määrittää halutun kokonaistilan sen sijaan, että määrittäisivät tarvittavat yksittäiset yksiköt.

Käytännön esimerkkinä voidaan mainita `swap.target`, joka ilmaisee valmiuden vaihtoon. Vaihtoprosessiin osallistuvat yksiköt voivat sovittaa toimintansa tähän tavoitteeseen käyttämällä asetusvaihtoehtoja kuten `WantedBy=` tai `RequiredBy=`. Toisaalta yksiköt, jotka ovat riippuvaisia vaihdosta, voivat ilmaista tämän asetuksilla kuten `Wants=`, `Requires=` ja `After=`, jotta ne voivat ilmaista riippuvuutensa ja käynnistysjärjestyksensä suhteessa vaihtoon.

### Hae ja määritä oletuskohde

Oletuskohteen hakeminen ja määrittäminen mahdollistaa järjestelmän oletustilan määrittämisen käynnistyksen yhteydessä. Näin löydät järjestelmäsi oletuskohteen:

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

Jos haluat muuttaa oletuskohdetta, käytä komentoa `set-default` yhdessä kohteen nimen kanssa. Aseta oletuskohteeksi `graphical.target`, joka käynnistää graafisen käyttöliittymän, seuraavalla komennolla:

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

### Luettelo saatavilla olevista kohteista

Voit luetella kaikki järjestelmässäsi käytettävissä olevat kohteet seuraavalla komennolla:

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

Tämä näyttää luettelon kaikista järjestelmään asennetuista kohdeyksikkötiedostoista. Jokaisesta kohteesta näytetään polku ja nykyinen tila (esim. aktivoitu tai deaktivoitu).

### Erotella kohteet

Käsköllä `isolate` voit aktivoida samanaikaisesti kaikki yksiköt, jotka on liitetty tiettyyn kohteeseen, ja pysäyttää kaikki muut yksiköt, joita ei ole liitetty siihen.

Oletetaan, että työskentelet ympäristössä, jossa `graphical.target` on käytössä, ja haluat siirtyä puhtaaseen monikäyttäjätilaan ilman graafista käyttöliittymää. Tällöin voit poistaa graafisen järjestelmän käytöstä eristämällä `multi-user.target`. Koska `graphical.target` on riippuvainen `multi-user.target`sta, mutta päinvastoin ei, kaikki graafiset palvelut pysähtyvät siirtymisen yhteydessä.

Ennen kohteen eristämistä sinun tulisi kuitenkin tarkistaa siihen liittyvät riippuvuudet. Näin vältät tärkeiden prosessien tahattoman pysäyttämisen.

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

Jos olet valinnut ne aktiiviset yksiköt, jotka haluat säilyttää, ja hyväksyt ne, voit määrittää halutun kohteen:

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

### Pikakuvakkeet tärkeisiin tapahtumiin

Keskeisille toiminnoille, kuten järjestelmän sammuttamiselle tai uudelleenkäynnistämiselle, on määritetty omat komennot. Linuxissa systemctl tarjoaa kuitenkin myös käteviä pikakomentoja, jotka tuovat lisätoimintoja. Jos haluat esimerkiksi siirtää järjestelmän pelastustilaan (yhden käyttäjän tilaan), voit käyttää `rescue` `isolate rescue.target` sijaan:

```bash
$ sudo systemctl rescue
```

Voit sammuttaa järjestelmän numerolla `stop`:

```bash
$ sudo systemctl stop
```

Voit käynnistää täydellisen sammutuksen numerolla `poweroff`:

```bash
$ sudo systemctl poweroff
```

Toisaalta voit käynnistää uudelleenkäynnistyksen numerolla `reboot`:

```bash
$ sudo systemctl reboot
```

Jos olet kirjautunut sisään, nämä komennot antavat sinulle tietoa tulevista tapahtumista. Pelkkä komennon suorittaminen tai kohteen eristäminen ei anna sinulle tätä tietoa. On tärkeää tietää, että monet tietokoneet yhdistävät näiden toimintojen lyhyemmät komennot systemd-palveluun varmistaakseen niiden oikean suorittamisen.

Seuraava komento riittää yleensä järjestelmän uudelleenkäynnistykseen:

```bash
$ sudo reboot
```


This is a markdown version of: [https://www.ionos.com/fi-fi/digitalguide/palvelin/asetukset/systemctl/](https://www.ionos.com/fi-fi/digitalguide/palvelin/asetukset/systemctl/) for AI/LLM consumption.