Урок 8. Службы systemd и журналы journalctl
Служба (service, ещё говорят «демон») — программа, которая работает в фоне, без окна: сервер SSH, веб-сервер, база данных, планировщик cron. Службы запускаются вместе с системой и работают, пока она включена.
В Ubuntu службами управляет systemd — самая первая программа, которую запускает ядро (основа системы, которая работает с оборудованием). Она поднимает все остальные, следит за ними, перезапускает упавшие и собирает их сообщения в общий журнал. Каждую службу systemd описывает файлом с расширением .service — его называют юнитом.
Состояние службы
systemctl status cronНачало ответа выглядит так:
● cron.service - Regular background program processing daemon
Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; preset: enabled)
Active: active (running) since …
Main PID: 1345 (cron)Loaded— где лежит файл службы;enabled— служба включена в автозагрузку,disabled— нет.Active— что с ней сейчас:active (running)— работает,inactive (dead)— остановлена,failed— упала с ошибкой.- Ниже идут последние строки журнала службы: при ошибке причина часто видна прямо здесь.
Если ответ длинный, он открывается в режиме просмотра — выход клавишей q. Чтобы ответ просто печатался в терминал, добавьте --no-pager.
Запустить, остановить, перезапустить
Для примера поставьте веб-сервер nginx — после установки он сразу запускается как служба:
sudo apt install nginx
sudo systemctl stop nginx
sudo systemctl start nginx
sudo systemctl restart nginx
sudo systemctl reload nginxstopиstart— остановить и запустить;restart— перезапустить: остановить и сразу запустить снова;reload— перечитать настройки без остановки. Это умеют не все службы: если служба не умеет, systemctl сообщит об ошибке, и тогда нуженrestart.
Если nginx потом не понадобится, удалите его: sudo apt purge nginx и sudo apt autoremove --purge.
Автозагрузка
sudo systemctl enable nginx
sudo systemctl disable nginx
sudo systemctl enable --now nginx
sudo systemctl disable --now nginx
systemctl is-enabled nginx
systemctl is-active nginxenable включает запуск службы при загрузке системы, но сейчас её не запускает. --now делает и то и другое сразу: enable --now — включить и запустить, disable --now — выключить и остановить. is-enabled и is-active отвечают одним словом — это удобно в скриптах.
В Ubuntu службы из пакетов обычно включаются и запускаются сами при установке. Если службу нужно запретить совсем, чтобы её не запустила даже другая служба, есть sudo systemctl mask имя (вернуть — unmask).
Список служб
systemctl list-units --type=service
systemctl list-units --type=service --state=running
systemctl --failed
systemctl list-unit-files --type=service- первые две команды — загруженные и работающие службы;
--failed— упавшие: если в системе что-то не так, начинайте с неё;list-unit-files— все установленные службы и их автозагрузка.
Журнал: journalctl
journalctl -u nginx
journalctl -u nginx -n 50
journalctl -u nginx -f
journalctl -u ssh --since "1 hour ago"
journalctl -b -p err
journalctl -b -1| Ключ | Что делает |
|---|---|
-u nginx | только записи службы nginx |
-n 50 | последние 50 строк |
-f | показывать новые записи по мере появления (выход — Ctrl+C) |
--since | с какого времени: today, yesterday, "1 hour ago", "2026-11-05 10:00" |
-b | с последней загрузки системы; -b -1 — за прошлую загрузку |
-p err | только ошибки и что ещё серьёзнее |
-e | сразу перейти в конец журнала |
Журнал листается так же, как less: стрелки, пробел, / для поиска, q для выхода.
Журнал сохраняется между перезагрузками (в папке /var/log/journal), поэтому journalctl -b -1 покажет, что происходило перед зависанием или внезапной перезагрузкой. Системные записи видят root и участники группы adm — первый пользователь в неё входит; остальным нужен sudo.
Сколько места занимает журнал и как его сократить:
sudo journalctl --disk-usage
sudo journalctl --vacuum-time=2weeks
sudo journalctl --vacuum-size=500M--vacuum-time=2weeks удаляет старые архивные записи старше двух недель, --vacuum-size=500M — сокращает архив до 500 МБ. Многие программы, кроме журнала, пишут ещё и свои файлы в /var/log/ — например, nginx в /var/log/nginx/.
Если служба не запускается
Когда systemctl start завершается ошибкой, systemd сам подсказывает, где смотреть:
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.- Выполните
systemctl status nginxи прочитайте последние строки. - Подробнее —
journalctl -xeu nginx:-xдобавляет пояснения,-eпереходит в конец. - Исправьте настройку. У многих программ есть своя проверка настроек:
sudo nginx -t,sudo sshd -t. - Запустите службу снова:
sudo systemctl restart nginx.
Ответ Unit nginx.service not found или could not be found значит, что служба называется иначе или программа не установлена.
Своя служба
Свою программу тоже можно сделать службой: она будет запускаться при загрузке и перезапускаться, если упадёт. Например, скрипт на Python /home/ivan/app/app.py. Создайте файл службы:
sudo nano /etc/systemd/system/hello.serviceС таким содержимым:
[Unit]
Description=Пример своей службы
After=network-online.target
Wants=network-online.target
[Service]
User=ivan
WorkingDirectory=/home/ivan/app
ExecStart=/usr/bin/python3 -u /home/ivan/app/app.py
Restart=on-failure
[Install]
WantedBy=multi-user.targetAfterиWants— запускать после того, как появилась сеть;User— от чьего имени работает программа: не от root — так безопаснее;ExecStart— команда запуска, с полными путями;Restart=on-failure— перезапускать, если программа завершилась с ошибкой;WantedBy=multi-user.target— запускать при обычной загрузке системы.
Ключ -u у Python отключает буферизацию вывода: без него строки print попадают в журнал с задержкой.
Включите службу и проверьте её:
sudo systemctl daemon-reload
sudo systemctl enable --now hello
systemctl status hello
journalctl -u hello -fdaemon-reload заставляет systemd перечитать файлы служб — он нужен после каждой правки файла .service. Всё, что программа печатает, попадает в журнал службы.
Файлы служб из пакетов лежат в /usr/lib/systemd/system/ — их не правят: обновление пакета затрёт изменения. Чтобы поменять настройку такой службы, выполните sudo systemctl edit nginx: команда откроет редактор и сохранит ваши строки отдельным файлом-дополнением в /etc/systemd/system/nginx.service.d/.
Перезагрузить или выключить компьютер — тоже дело systemd: об этом справка Как перезагрузить или выключить из терминала.
Коротко
systemctl status имя— состояние и последние строки журнала службы.start,stop,restart,reload— управление сейчас;enable,disable— автозагрузка;--now— и то и другое.systemctl --failed— упавшие службы.journalctl -u имя— журнал службы;-f— следить,-b -1— прошлая загрузка,-p err— только ошибки.- Своя служба — файл в
/etc/systemd/system/, затемdaemon-reloadиenable --now.