6 modulis · 6.1
Paslaugų valdymas su systemd
6 modulis: Paslaugos ir žurnalai · Skaitymo laikas: 10 min.
Mokymosi tikslas: Po šios pamokos galėsite paleisti, sustabdyti ir perkrauti paslaugas, nustatyti, kad jos būtų paleidžiamos įjungiant serverį, skaityti paslaugos būseną ir saugiai pakeisti paslaugos nustatymą naudodami drop-in failą.
Pagrindinės sąvokos: systemd, unit, service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, drop-in, systemctl edit, daemon-reload, Restart=
Kas palaiko viską veikiantį?
Serveryje veikia dešimtys programų, kurios turi būti pasiekiamos visada: SSH serveris, žiniatinklio serveris, duomenų bazė, laiko sinchronizavimas. Tokios programos vadinamos paslaugomis (services arba daemons). Kažkas turi jas paleisti įjungiant serverį, stebėti ir paleisti iš naujo, jei jos sugenda. Debian, Ubuntu, AlmaLinux ir Rocky Linux sistemose tai daro systemd. Tai pirmoji programa, kurią paleidžia branduolys (procesas 1), o ji paskui paleidžia visa kita.
systemd dirba su units (vienetais): aprašais to, ką ji turi valdyti. Svarbiausios rūšys:
| Rūšis | Plėtinys | Pavyzdys |
|---|---|---|
| Paslauga | .service | nginx.service, ssh.service |
| Laikmatis (suplanuota užduotis) | .timer | apt-daily.timer (pamoka 4.2, pamoka 6.3) |
| Lizdas (socket) | .socket | ssh.socket Ubuntu 24.04 ir naujesnėse versijose |
| Tikslas (unit grupė) | .target | multi-user.target |
Su systemd bendraujate per komandą systemctl. Plėtinio .service galite nerašyti: systemctl status nginx yra tas pats kaip systemctl status nginx.service.
Būsenos skaitymas
Komanda, kurią naudosite dažniausiai:
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...Skaitykite iš viršaus į apačią:
- Taškelis prieš pavadinimą yra žalias, kai paslauga veikia, baltas, kai sustabdyta, ir raudonas, kai nepavyko.
- Loaded nurodo, kur yra unit failas ir ar paslauga paleidžiama įjungiant serverį (
enabled), ar ne (disabled). - Active nurodo, ar ji šiuo metu veikia (
active (running)), yra sustabdyta (inactive (dead)) ar nepavyko (failed), ir nuo kada. - Main PID ir CGroup rodo, kurie procesai priklauso paslaugai.
- Apačioje matomos paskutinės paslaugos žurnalo eilutės. Dažnai jau ten parašyta, kodėl kažkas nepavyksta; daugiau perskaitysite su
journalctl(pamoka 6.2).
Paleidimas, sustabdymas, paleidimas iš naujo ir perkrovimas
anna@web1:~$ sudo systemctl start nginx # paleisti dabar
anna@web1:~$ sudo systemctl stop nginx # sustabdyti dabar
anna@web1:~$ sudo systemctl restart nginx # sustabdyti ir vėl paleisti
anna@web1:~$ sudo systemctl reload nginx # iš naujo nuskaityti konfigūraciją nesustabdantSkirtumas tarp restart ir reload praktikoje yra svarbus. Atliekant restart paslauga trumpam sustoja: esami ryšiai nutraukiami, o jei naujoje konfigūracijoje yra klaida, paslauga nebepasileidžia ir Jūsų svetainė nustoja veikti. Atliekant reload paslauga iš naujo perskaito savo konfigūraciją ir toliau veikia; jei konfigūracijoje yra klaida, nginx išlaiko senąją. Todėl pakeitę nginx, Caddy, SSH ir fail2ban konfigūraciją naudokite reload ir pirmiausia patikrinkite konfigūraciją (nginx -t, sshd -t, fail2ban-client -t). Ne kiekviena paslauga palaiko reload; systemctl reload-or-restart pasirenka pati.
Įjungiant serverį: enable ir disable
Paleisti ir „paleisti įjungiant serverį“ yra du skirtingi dalykai:
anna@web1:~$ sudo systemctl enable nginx # nuo šiol paleidžiama įkeliant sistemą
anna@web1:~$ sudo systemctl disable nginx # nebepaleidžiama įkeliant sistemą
anna@web1:~$ sudo systemctl enable --now nginx # abu: paleisti dabar ir įkeliant sistemą
anna@web1:~$ systemctl is-enabled nginx
enabledKlasikinė klaida: paleidžiate paslaugą su start, viskas veikia, o po kito perkrovimo (pavyzdžiui, dėl branduolio atnaujinimo, pamoka 4.2) jos nebėra. Todėl naujai paslaugai naudokite enable --now.
Jei norite būti tikri, kad paslauga niekada nepasileis, net jei jos paprašys kita paslauga, yra mask: sudo systemctl mask <dienst>. Atšaukti galite su unmask.
Kas negerai?
Viena komanda parodo visus nepavykusius units:
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.Paverskite tai įpročiu, pavyzdžiui, po kiekvieno perkrovimo ir kiekvieno atnaujinimo (pamoka 4.3): sąrašas turi būti tuščias. Išsprendę problemą, pranešimą pašalinkite su sudo systemctl reset-failed.
Visų veikiančių paslaugų apžvalga:
anna@web1:~$ systemctl list-units --type=service --state=runningJei veikia kažkas, ko nepažįstate arba nenaudojate, išsiaiškinkite, kas tai yra. Kiekviena nereikalinga paslauga yra perteklinis atakos paviršius (pamoka 5.1 ir 10.1).
Unit failai ir drop-in failai
Unit failas yra tekstinis failas. Paketo versija yra /usr/lib/systemd/system/ (senesnėse sistemose /lib/systemd/system/). Jos niekada nekeiskite: paketo atnaujinimas ją perrašys. Savo pakeitimus įrašykite į drop-in failą: nedidelį failą, kuriame yra tik tos eilutės, kurias norite pakeisti. Paprasčiausia tai padaryti taip:
anna@web1:~$ sudo systemctl edit nginxAtsidaro redaktorius su tuščia vieta tarp dviejų komentaro eilučių. Tai, ką ten parašysite, pateks į /etc/systemd/system/nginx.service.d/override.conf. Pavyzdžiui: automatiškai paleisti nginx iš naujo, jei jis netikėtai sustoja.
[Service]
Restart=on-failure
RestartSec=5sIšsaugojus systemctl edit pati perkrauna systemd konfigūraciją. Jei unit failą redaguojate kitu būdu, atlikite tai patys:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxdaemon-reload priverčia systemd iš naujo perskaityti unit failus; pačią paslaugą po to dar reikia paleisti iš naujo, kad ji naudotų pakeitimą. Visą rezultatą (originalą kartu su drop-in failais) pamatysite su systemctl cat nginx.
Restart=on-failure yra geras įprotis svarbioms paslaugoms. Tačiau neslėpkite juo tikros klaidos: paslaugos, kuri kas penkias sekundes nulūžta ir pasileidžia iš naujo, priežasties reikia ieškoti žurnale. Po kelių greitų nesėkmių iš eilės systemd nustoja ją perkrauti (numatytoji riba yra penki paleidimai per dešimt sekundžių) ir nustato paslaugai būseną failed.
AlmaLinux ir Rocky Linux sistemose
systemd ir systemctl veikia lygiai taip pat. Kartais skiriasi tik paslaugų pavadinimai: SSH paslauga vadinasi sshd, distribucijos žiniatinklio serveris vadinasi httpd (Apache) arba nginx, o užkarda firewalld.
Praktikoje
Jūsų paslaugų teikėjo VPS ekrane (WebOké ir kitur) galima išjungti visą serverį, jį perkrauti arba „priverstinai išjungti“. Pastarasis veiksmas prilygsta kištuko ištraukimui: paslaugos negauna galimybės tvarkingai sustoti, todėl gali būti sugadinta duomenų bazė. Serverio viduje naudokite sudo systemctl reboot arba sudo shutdown -h now, o skydelyje įprastą išjungimo arba perkrovimo mygtuką.
Santrauka
- systemd paleidžia ir stebi visas paslaugas; ją valdote su
systemctl. systemctl statusparodo, ar paslauga veikia, ar ji paleidžiama įjungiant serverį, ir paskutines žurnalo eilutes.start/stop/restartgalioja dabar,enable/disableserverio įjungimui; naujai paslaugai naudokiteenable --now.- Pakeitus konfigūraciją: pirmiausia patikrinti, tada
reload;systemctl --failedturi būti tuščias. - Niekada nekeiskite paketo unit failo, o naudokite drop-in failą su
systemctl edit.
Testas (quiz)
Užduotis
Užduotis O6.1: Jūsų paslaugų apžvalga. Savo serveryje sudarykite visų veikiančių paslaugų sąrašą (systemctl list-units --type=service --state=running) ir patikrinkite, ar systemctl --failed yra tuščias. Prie kiekvienos paslaugos nurodykite, ką ji daro ir ar Jums jos reikia. Apie vieną paslaugą, kurios nepažinojote, išsiaiškinkite, kas tai yra (systemctl status, man). Po to vienai svarbiai paslaugai nustatykite Restart=on-failure drop-in faile ir su systemctl cat patikrinkite, ar nustatymas ten yra.
Užduotis O6.1: Jūsų paslaugų apžvalga
Šią užduotį atliekate patys; niekas jos netikrina. Pažymėkite, ką atlikote, ir pažymėkite užduotį kaip atliktą.
Drop-in failas yra /etc/systemd/system/<naam>.service.d/override.conf, o ne /usr/lib/systemd. Atliekant reload paslauga toliau veikia, o, pavyzdžiui, nginx esant klaidai išlaiko senąją konfigūraciją; iš anksto patikrinkite su nginx -t arba sshd -t. Nereikalingos paslaugos: disable --now arba pašalinkite paketą.
Jūsų pažymėti varneliai ir pastabos lieka tik šioje naršyklėje; niekur jų nesiunčiame. Jei esate prisijungę, skiltyje Mano kursai išsaugome tik tai, kad užduotį atlikote.
Skaitykite daugiau
- Vadovas
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Vadovas
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Vadovas
systemd.unit(5)(drop-in failai): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html
