Модул 6 · 6.1
Управление на услуги със systemd
Модул 6: Услуги и логове · Време за четене: 10 минути
Цел на урока: След този урок ще можете да стартирате, спирате и презареждате услуги и да ги настройвате да се стартират при зареждане на системата, да четете статуса на услуга и безопасно да променяте настройка на услуга с drop-in.
Основни понятия: systemd, unit, service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, drop-in, systemctl edit, daemon-reload, Restart=
Кой поддържа всичко да работи?
На един сървър работят десетки програми, които трябва да са налични постоянно: SSH сървърът, уеб сървърът, базата данни, синхронизацията на времето. Такива програми се наричат услуги (services или daemons). Някой трябва да ги стартира при зареждане на системата, да ги наблюдава и да ги рестартира, ако спрат. В Debian, Ubuntu, AlmaLinux и Rocky Linux това прави systemd. Това е първата програма, която ядрото стартира (процес 1), а след това тя стартира всичко останало.
systemd работи с units: описания на нещо, което трябва да управлява. Най-важните видове са:
| Вид | Разширение | Пример |
|---|---|---|
| Услуга | .service | nginx.service, ssh.service |
| Таймер (планирана задача) | .timer | apt-daily.timer (урок 4.2, урок 6.3) |
| Сокет | .socket | ssh.socket в Ubuntu 24.04 и по-нови версии |
| Цел (група units) | .target | multi-user.target |
Със systemd общувате чрез командата systemctl. Разширението .service може да се пропусне: systemctl status nginx е същото като systemctl status nginx.service.
Четене на статуса
Командата, която ще използвате най-често:
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...Четете отгоре надолу:
- Точката пред името е зелена при работеща услуга, бяла при спряна и червена при неуспешна.
- Loaded показва къде се намира unit файлът и дали услугата се стартира при зареждане на системата (
enabled) или не (disabled). - Active показва дали в момента работи (
active (running)), е спряна (inactive (dead)) или е завършила с грешка (failed), както и от кога. - Main PID и CGroup показват кои процеси принадлежат на услугата.
- Най-отдолу са последните редове от лога на услугата. Често там вече пише защо нещо не работи; повече ще прочетете с
journalctl(урок 6.2).
Стартиране, спиране, рестартиране и презареждане
anna@web1:~$ sudo systemctl start nginx # стартиране сега
anna@web1:~$ sudo systemctl stop nginx # спиране сега
anna@web1:~$ sudo systemctl restart nginx # спиране и повторно стартиране
anna@web1:~$ sudo systemctl reload nginx # повторно прочитане на конфигурацията без спиранеРазликата между restart и reload е важна на практика. При restart услугата спира за кратко: текущите връзки се прекъсват, а ако новата конфигурация съдържа грешка, услугата вече не се стартира и Вашият сайт спира да работи. При reload услугата прочита конфигурацията си наново, докато продължава да работи; при грешка в конфигурацията nginx запазва старата. Затова след промяна в конфигурацията на nginx, Caddy, SSH и fail2ban използвайте reload и първо тествайте конфигурацията (nginx -t, sshd -t, fail2ban-client -t). Не всяка услуга поддържа reload; systemctl reload-or-restart избира сам.
При зареждане на системата: enable и disable
Стартирането и "стартирането при зареждане на системата" са две различни неща:
anna@web1:~$ sudo systemctl enable nginx # оттук нататък стартира при зареждане на системата
anna@web1:~$ sudo systemctl disable nginx # вече не стартира при зареждане на системата
anna@web1:~$ sudo systemctl enable --now nginx # и двете: стартиране сега и при зареждане на системата
anna@web1:~$ systemctl is-enabled nginx
enabledКласическа грешка: стартирате услуга с start, всичко работи, а след следващия рестарт (например заради актуализация на ядрото, урок 4.2) услугата я няма. Затова за нова услуга използвайте enable --now.
Ако искате да сте сигурни, че една услуга никога няма да се стартира, дори ако друга услуга я изисква, има mask: sudo systemctl mask <dienst>. Отменя се с unmask.
Какво не е наред?
Една команда показва всички неуспешни 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.Превърнете това в навик, например след всеки рестарт и всяко надграждане (урок 4.3): списъкът трябва да е празен. След като отстраните проблема, премахнете съобщението с sudo systemctl reset-failed.
Преглед на всички работещи услуги:
anna@web1:~$ systemctl list-units --type=service --state=runningАко работи нещо, което не познавате или не използвате, проверете какво е. Всяка ненужна услуга е излишна повърхност за атака (урок 5.1 и 10.1).
Unit файлове и drop-ins
Unit файлът е текстов файл. Версията от пакета се намира в /usr/lib/systemd/system/ (в по-стари системи /lib/systemd/system/). Него никога не го променяйте: актуализация на пакета ще го презапише. Собствените си промени поставяйте в drop-in: малък файл, който съдържа само редовете, които искате да промените. Най-лесно става така:
anna@web1:~$ sudo systemctl edit nginxОтваря се редактор с празна част между два реда с коментари. Това, което напишете там, се записва в /etc/systemd/system/nginx.service.d/override.conf. Например: nginx да се рестартира автоматично, ако спре неочаквано.
[Service]
Restart=on-failure
RestartSec=5sСлед запазване systemctl edit сам презарежда конфигурацията на systemd. Ако редактирате unit файл по друг начин, изпълнете сами:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxdaemon-reload кара systemd да прочете наново unit файловете; самата услуга трябва след това да се рестартира, за да използва промяната. Пълния резултат (оригинала плюс drop-ins) виждате с systemctl cat nginx.
Restart=on-failure е добър навик за важни услуги. Но не прикривайте с него истинска грешка: услуга, която се срива и рестартира на всеки пет секунди, трябва да се проучи в лога. След няколко бързи последователни неуспеха systemd спира да рестартира (стандартната граница е пет стартирания в рамките на десет секунди) и поставя услугата в състояние failed.
В AlmaLinux и Rocky Linux
systemd и systemctl работят по абсолютно същия начин. Само имената на услугите понякога се различават: SSH услугата се казва sshd, уеб сървърът от дистрибуцията се казва httpd (Apache) или nginx, а защитната стена firewalld.
На практика
Екранът за VPS на Вашия доставчик (при WebOké и другаде) може да изключи целия сървър, да го рестартира или да го "изключи принудително". Последното е като да издърпате щепсела: услугите нямат възможност да спрат коректно и базата данни може да се повреди. В самия сървър използвайте sudo systemctl reboot или sudo shutdown -h now, а в панела обикновения бутон за изключване или рестартиране.
Обобщение
- systemd стартира и наблюдава всички услуги; управлявате го с
systemctl. systemctl statusпоказва дали услугата работи, дали се стартира при зареждане на системата и последните редове от лога.start/stop/restartважат за момента,enable/disableза зареждането на системата; за нова услуга използвайтеenable --now.- След промяна в конфигурацията: първо тест, после
reload;systemctl --failedтрябва да е празен. - Никога не променяйте unit файла на пакет, а използвайте drop-in с
systemctl edit.
Тест (quiz)
Задача
Задача O6.1: Преглед на Вашите услуги. Направете на сървъра си списък на всички работещи услуги (systemctl list-units --type=service --state=running) и проверете дали systemctl --failed е празен. За всяка услуга отбележете какво прави и дали Ви е нужна. За една услуга, която не сте познавали, проучете какво представлява (systemctl status, man). След това за една важна услуга задайте Restart=on-failure в drop-in и проверете с systemctl cat, че настройката е там.
Задача O6.1: Преглед на Вашите услуги
Тази задача изпълнявате сами; никой не я проверява. Отбележете какво сте направили и маркирайте задачата като изпълнена.
Drop-in файлът се намира в /etc/systemd/system/<naam>.service.d/override.conf, а не в /usr/lib/systemd. При reload услугата продължава да работи и например nginx запазва старата конфигурация при грешка; проверете предварително с nginx -t или sshd -t. Ненужни услуги: disable --now или премахване на пакета.
Вашите отметки и бележки остават само в този браузър; не ги изпращаме никъде. Ако сте влезли, в Моите курсове запазваме само че сте изпълнили задачата.
Още за четене
- Ръководство
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Ръководство
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Ръководство
systemd.unit(5)(drop-ins): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html
