Moduuli 6 · 6.1
Palveluiden hallinta systemd:llä
Moduuli 6: Palvelut ja lokit · Lukuaika: 10 minuuttia
Tavoite: Tämän oppitunnin jälkeen osaat käynnistää, pysäyttää ja ladata palveluja uudelleen sekä asettaa ne käynnistymään käynnistyksen yhteydessä. Osaat myös lukea palvelun tilan ja muuttaa palvelun asetusta turvallisesti drop-inillä.
Keskeiset käsitteet: systemd, unit, service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, drop-in, systemctl edit, daemon-reload, Restart=
Kuka pitää kaiken käynnissä?
Palvelimella pyörii kymmeniä ohjelmia, joiden pitää olla aina käytettävissä: SSH-palvelin, verkkopalvelin, tietokanta ja ajan synkronointi. Tällaisia ohjelmia kutsutaan palveluiksi (services tai daemons). Jonkun täytyy käynnistää ne käynnistyksen yhteydessä, valvoa niitä ja käynnistää ne uudelleen, jos ne kaatuvat. Debianissa, Ubuntussa, AlmaLinuxissa ja Rocky Linuxissa tämän hoitaa systemd. Se on ensimmäinen ohjelma, jonka kernel käynnistää (prosessi 1), ja se käynnistää sen jälkeen kaiken muun.
systemd käyttää unitteja: kuvauksia asioista, joita sen pitää hallita. Tärkeimmät tyypit:
| Tyyppi | Pääte | Esimerkki |
|---|---|---|
| Palvelu | .service | nginx.service, ssh.service |
| Ajastin (ajastettu tehtävä) | .timer | apt-daily.timer (oppitunti 4.2, oppitunti 6.3) |
| Socket | .socket | ssh.socket Ubuntu 24.04:ssä ja uudemmissa |
| Kohde (unit-ryhmä) | .target | multi-user.target |
systemd:lle puhutaan komennolla systemctl. Päätteen .service voi jättää pois: systemctl status nginx on sama kuin systemctl status nginx.service.
Tilan lukeminen
Komento, jota käytät useimmin:
anna@web1:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-11-09 08:12:44 CET; 3h 2min ago
Docs: man:nginx(8)
Process: 902 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 905 (nginx)
Tasks: 3 (limit: 2275)
Memory: 4.1M (peak: 6.3M)
CPU: 213ms
CGroup: /system.slice/nginx.service
├─905 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─906 "nginx: worker process"
nov 09 08:12:44 web1 systemd[1]: Starting nginx.service - A high performance web server...
nov 09 08:12:44 web1 systemd[1]: Started nginx.service - A high performance web server...Lue se ylhäältä alas:
- Nimen edessä oleva pallo on vihreä, kun palvelu on käynnissä, valkoinen, kun se on pysäytetty, ja punainen, kun se on epäonnistunut.
- Loaded kertoo, missä unit-tiedosto on ja käynnistyykö palvelu käynnistyksen yhteydessä (
enabled) vai ei (disabled). - Active kertoo, onko palvelu nyt käynnissä (
active (running)), pysäytetty (inactive (dead)) vai epäonnistunut (failed), ja mistä lähtien. - Main PID ja CGroup näyttävät, mitkä prosessit kuuluvat palveluun.
- Alimpana ovat palvelun lokin viimeiset rivit. Niistä näkyy usein jo, miksi jokin menee pieleen. Lisää luet komennolla
journalctl(oppitunti 6.2).
Käynnistäminen, pysäyttäminen, uudelleenkäynnistys ja uudelleenlataus
anna@web1:~$ sudo systemctl start nginx # käynnistä nyt
anna@web1:~$ sudo systemctl stop nginx # pysäytä nyt
anna@web1:~$ sudo systemctl restart nginx # pysäytä ja käynnistä uudelleen
anna@web1:~$ sudo systemctl reload nginx # lue asetukset uudelleen pysäyttämättäEro restartin ja reloadin välillä on käytännössä tärkeä. Restartissa palvelu pysähtyy hetkeksi: avoimet yhteydet katkeavat, ja jos uudessa määrityksessä on virhe, palvelu ei enää käynnisty ja sivustosi on alhaalla. Reloadissa palvelu lukee määrityksensä uudelleen ja pysyy samalla käynnissä. Jos määrityksessä on virhe, nginx pitää vanhan voimassa. Käytä siis nginxille, Caddylle, SSH:lle ja fail2banille määritysmuutoksen jälkeen reloadia ja testaa määritys ensin (nginx -t, sshd -t, fail2ban-client -t). Kaikki palvelut eivät tue reloadia. systemctl reload-or-restart valitsee itse.
Käynnistyksen yhteydessä: enable ja disable
Käynnistäminen ja "käynnistyminen käynnistyksen yhteydessä" ovat kaksi eri asiaa:
anna@web1:~$ sudo systemctl enable nginx # käynnistyy jatkossa järjestelmän käynnistyessä
anna@web1:~$ sudo systemctl disable nginx # ei enää käynnisty järjestelmän käynnistyessä
anna@web1:~$ sudo systemctl enable --now nginx # molemmat: käynnistä nyt ja järjestelmän käynnistyessä
anna@web1:~$ systemctl is-enabled nginx
enabledKlassinen virhe: käynnistät palvelun komennolla start, kaikki toimii, ja seuraavan uudelleenkäynnistyksen jälkeen (esimerkiksi kernel-päivityksen takia, oppitunti 4.2) palvelu on poissa. Käytä siksi uudelle palvelulle komentoa enable --now.
Jos haluat varmistaa, ettei palvelu käynnisty koskaan, ei edes silloin, kun jokin toinen palvelu pyytää sitä, käytä mask: sudo systemctl mask <dienst>. Peruminen onnistuu komennolla unmask.
Mikä on vialla?
Yksi komento näyttää kaikki epäonnistuneet unitit:
anna@web1:~$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● php8.4-fpm.service loaded failed failed The PHP 8.4 FastCGI Process Manager
1 loaded units listed.Tee tästä tapa, esimerkiksi jokaisen uudelleenkäynnistyksen ja päivityksen jälkeen (oppitunti 4.3): listan pitää olla tyhjä. Kun ongelma on korjattu, poistat ilmoituksen komennolla sudo systemctl reset-failed.
Yleiskatsaus kaikista käynnissä olevista palveluista:
anna@web1:~$ systemctl list-units --type=service --state=runningJos käynnissä on jotain, mitä et tunne tai käytä, selvitä mitä se on. Jokainen tarpeeton palvelu on turhaa hyökkäyspintaa (oppitunnit 5.1 ja 10.1).
Unit-tiedostot ja drop-init
Unit-tiedosto on tekstitiedosto. Paketin versio on hakemistossa /usr/lib/systemd/system/ (vanhemmissa järjestelmissä /lib/systemd/system/). Sitä et muokkaa koskaan: paketin päivitys korvaa sen. Omat muutokset laitat drop-iniin: pieneen tiedostoon, joka sisältää vain rivit, jotka haluat muuttaa. Helpoimmin se onnistuu näin:
anna@web1:~$ sudo systemctl edit nginxAvautuu editori, jossa on tyhjä kohta kahden kommenttirivin välissä. Mitä kirjoitat siihen, tallentuu tiedostoon /etc/systemd/system/nginx.service.d/override.conf. Esimerkiksi: nginx käynnistetään automaattisesti uudelleen, jos se pysähtyy odottamatta.
[Service]
Restart=on-failure
RestartSec=5sTallennuksen jälkeen systemctl edit lataa systemd:n määrityksen uudelleen itse. Jos muokkaat unit-tiedostoa muulla tavalla, tee itse:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxdaemon-reload saa systemd:n lukemaan unit-tiedostot uudelleen. Itse palvelu täytyy sen jälkeen vielä käynnistää uudelleen, jotta muutos otetaan käyttöön. Koko tuloksen (alkuperäinen plus drop-init) näet komennolla systemctl cat nginx.
Restart=on-failure on hyvä tapa tärkeille palveluille. Älä kuitenkaan piilota sillä todellista virhettä: palvelu, joka kaatuu ja käynnistyy uudelleen viiden sekunnin välein, kannattaa selvittää lokista. systemd lopettaa uudelleenkäynnistämisen muutaman nopean peräkkäisen epäonnistumisen jälkeen (oletusraja on viisi käynnistystä kymmenessä sekunnissa) ja asettaa palvelun tilaan failed.
AlmaLinuxissa ja Rocky Linuxissa
systemd ja systemctl toimivat täsmälleen samoin. Vain palveluiden nimet eroavat joskus: SSH-palvelun nimi on sshd, jakelun verkkopalvelin on httpd (Apache) tai nginx ja palomuuri firewalld.
Käytännössä
Palveluntarjoajasi VPS-näkymästä (WebOkéssa ja muualla) voit sammuttaa koko palvelimen, käynnistää sen uudelleen tai "pakottaa sammutuksen". Viimeinen vastaa töpselin irrottamista: palvelut eivät ehdi pysähtyä siististi, ja tietokanta voi vahingoittua. Käytä palvelimen sisällä komentoa sudo systemctl reboot tai sudo shutdown -h now ja paneelissa tavallista sammutus- tai uudelleenkäynnistyspainiketta.
Yhteenveto
- systemd käynnistää ja valvoo kaikkia palveluja. Sitä ohjataan komennolla
systemctl. systemctl statusnäyttää, onko palvelu käynnissä, käynnistyykö se käynnistyksen yhteydessä, sekä viimeiset lokirivit.start/stop/restartkoskevat tätä hetkeä,enable/disablekäynnistystä. Käytä uudelle palvelulle komentoaenable --now.- Määritysmuutoksen jälkeen: testaa ensin, sitten
reload.systemctl --failedpitää olla tyhjä. - Älä koskaan muokkaa paketin unit-tiedostoa, vaan käytä drop-iniä komennolla
systemctl edit.
Tietovisa (quiz)
Tehtävä
Tehtävä O6.1: Palveluidesi kartoitus. Tee palvelimellasi lista kaikista käynnissä olevista palveluista (systemctl list-units --type=service --state=running) ja tarkista, onko systemctl --failed tyhjä. Kirjaa jokaisesta palvelusta, mitä se tekee ja tarvitsetko sitä. Selvitä yhdestä palvelusta, jota et tuntenut, mikä se on (systemctl status, man). Aseta sen jälkeen yhdelle tärkeälle palvelulle Restart=on-failure drop-iniin ja tarkista komennolla systemctl cat, että se on paikallaan.
Tehtävä O6.1: Palveluidesi kartoitus
Tämän tehtävän teet itse, kukaan ei tarkista sitä. Merkitse tekemäsi kohdat ja merkitse tehtävä tehdyksi.
Drop-in on tiedostossa /etc/systemd/system/<naam>.service.d/override.conf, ei hakemistossa /usr/lib/systemd. Reloadissa palvelu jatkaa toimintaansa, ja esimerkiksi nginx pitää virheen sattuessa vanhan määrityksen; testaa etukäteen komennolla nginx -t tai sshd -t. Tarpeettomat palvelut: disable --now tai poista paketti.
Merkintäsi ja muistiinpanosi pysyvät vain tässä selaimessa, emme lähetä niitä minnekään. Jos olet kirjautunut sisään, tallennamme kohtaan Omat kurssit vain sen, että olet tehnyt tehtävän.
Lue lisää
- Ohjesivu
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Ohjesivu
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Ohjesivu
systemd.unit(5)(drop-init): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html
