Глиф Учебники

Урок 8. Службы systemd и журналы journalctl

Курс «Ubuntu» · урок 8 из 8 · 5 минут чтения

Служба (service, ещё говорят «демон») — программа, которая работает в фоне, без окна: сервер SSH, веб-сервер, база данных, планировщик cron. Службы запускаются вместе с системой и работают, пока она включена.

В Ubuntu службами управляет systemd — самая первая программа, которую запускает ядро (основа системы, которая работает с оборудованием). Она поднимает все остальные, следит за ними, перезапускает упавшие и собирает их сообщения в общий журнал. Каждую службу systemd описывает файлом с расширением .service — его называют юнитом.

ядро Linux systemd запускает службы перезапускает упавшие собирает журнал ssh.service сервер SSH cron.service планировщик nginx.service веб-сервер журнал journalctl
Ядро запускает systemd, а он запускает службы из файлов .service, перезапускает упавшие и собирает их сообщения в журнал.

Состояние службы

Bash
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)

Если ответ длинный, он открывается в режиме просмотра — выход клавишей q. Чтобы ответ просто печатался в терминал, добавьте --no-pager.

Запустить, остановить, перезапустить

Для примера поставьте веб-сервер nginx — после установки он сразу запускается как служба:

Bash
sudo apt install nginx
sudo systemctl stop nginx
sudo systemctl start nginx
sudo systemctl restart nginx
sudo systemctl reload nginx

Если nginx потом не понадобится, удалите его: sudo apt purge nginx и sudo apt autoremove --purge.

Автозагрузка

Bash
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 nginx

enable включает запуск службы при загрузке системы, но сейчас её не запускает. --now делает и то и другое сразу: enable --now — включить и запустить, disable --now — выключить и остановить. is-enabled и is-active отвечают одним словом — это удобно в скриптах.

systemctl … сейчас работает ли служба при загрузке автозагрузка start запускает — не меняет stop останавливает — не меняет enable — не меняет включает disable — не меняет выключает enable --now запускает включает disable --now останавливает выключает
start и stop действуют на службу сейчас, enable и disable — на автозагрузку, а с ключом --now команда делает и то и другое.

В Ubuntu службы из пакетов обычно включаются и запускаются сами при установке. Если службу нужно запретить совсем, чтобы её не запустила даже другая служба, есть sudo systemctl mask имя (вернуть — unmask).

Список служб

Bash
systemctl list-units --type=service
systemctl list-units --type=service --state=running
systemctl --failed
systemctl list-unit-files --type=service

Журнал: journalctl

Bash
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.

Сколько места занимает журнал и как его сократить:

Bash
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.
  1. Выполните systemctl status nginx и прочитайте последние строки.
  2. Подробнее — journalctl -xeu nginx: -x добавляет пояснения, -e переходит в конец.
  3. Исправьте настройку. У многих программ есть своя проверка настроек: sudo nginx -t, sudo sshd -t.
  4. Запустите службу снова: sudo systemctl restart nginx.

Ответ Unit nginx.service not found или could not be found значит, что служба называется иначе или программа не установлена.

Своя служба

Свою программу тоже можно сделать службой: она будет запускаться при загрузке и перезапускаться, если упадёт. Например, скрипт на Python /home/ivan/app/app.py. Создайте файл службы:

Bash
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.target

Ключ -u у Python отключает буферизацию вывода: без него строки print попадают в журнал с задержкой.

Включите службу и проверьте её:

Bash
sudo systemctl daemon-reload
sudo systemctl enable --now hello
systemctl status hello
journalctl -u hello -f

daemon-reload заставляет systemd перечитать файлы служб — он нужен после каждой правки файла .service. Всё, что программа печатает, попадает в журнал службы.

загрузка системы если enable systemd ExecStart=… User=ivan python3 -u app.py работает от ivan если упала — перезапуск Restart=on-failure print журнал службы journalctl -u hello hello.service /etc/systemd/system/ после правки: daemon-reload читает файл
Служба hello после enable запускается при загрузке от имени ivan, после сбоя перезапускается, а вывод программы идёт в журнал.

Файлы служб из пакетов лежат в /usr/lib/systemd/system/ — их не правят: обновление пакета затрёт изменения. Чтобы поменять настройку такой службы, выполните sudo systemctl edit nginx: команда откроет редактор и сохранит ваши строки отдельным файлом-дополнением в /etc/systemd/system/nginx.service.d/.

Перезагрузить или выключить компьютер — тоже дело systemd: об этом справка Как перезагрузить или выключить из терминала.

Коротко

Проверьте себя

1. Чем systemctl enable отличается от systemctl start?
2. Как посмотреть журнал службы nginx?
3. Что нужно выполнить после правки файла .service?
4. Как посмотреть записи журнала за прошлую загрузку системы?