С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Служба (service)

4 мин Linux

Что такое служба, чем она отличается от обычной программы и как ей управлять.

Шпаргалка

8 команд Версия для печати
  • systemctl status nginx --no-pager состояние службы
  • sudo systemctl status nginx + последние строки журнала
  • sudo systemctl start nginx запустить сейчас
  • sudo systemctl stop nginx остановить сейчас
  • sudo systemctl restart nginx перезапустить
  • sudo systemctl enable nginx включить автозапуск при загрузке
  • sudo systemctl enable --now nginx включить автозапуск и сразу запустить
  • sudo journalctl -u nginx -e журнал именно этой службы

Обзор

Служба — программа, которая работает в фоне без прямого участия пользователя и обслуживает какую-то функцию системы или сети: веб-сервер отвечает на запросы, СУБД хранит данные, sshd принимает подключения. В отличие от команды, которую ты запускаешь и ждёшь, служба живёт постоянно (или до следующей перезагрузки) и обычно переживает выход из терминала, в котором её запустили, — потому что запускает и следит за ней не терминал, а init-система.

В современных дистрибутивах Linux эту роль играет systemd — первый процесс системы (PID 1). Служба описывается unit-файлом (.service) и управляется командой systemctl:

bash
systemctl status nginx
# ● nginx.service - A high performance web server
#      Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
#      Active: active (running) since ...

Эта статья — про службу как понятие: что это и как ей управлять на базовом уровне. Что такое unit-файл, зависимости, цели (targets) и сокет-активация — в systemd. Полный набор команд systemctl (mask, isolate, edit) — в systemctl. Журналы служб — в journalctl.

Рецепты

3

Проверить, работает ли служба

bash
systemctl status nginx --no-pager  # состояние словами, без пейджера
sudo systemctl status nginx --no-pager   # + последние строки журнала
systemctl is-active nginx          # только слово active/inactive/failed (для скриптов)

Запустить, остановить, включить автозапуск

bash
sudo systemctl start nginx         # сейчас, до перезагрузки
sudo systemctl stop nginx          # остановить сейчас
sudo systemctl enable nginx        # автозапуск при следующей загрузке (не запускает сейчас)
sudo systemctl enable --now nginx  # и то и другое одной командой
sudo systemctl disable nginx       # убрать из автозапуска

Посмотреть, что писала служба

bash
sudo journalctl -u nginx -e        # журнал службы, сразу конец
sudo journalctl -u nginx --since "10 min ago"

Неполадки

5

Служба «упала», а systemctl status показывает active

Возможно, ты смотришь другую службу или переименованный юнит (алиасы, .socket вместо .service). Сверь точное имя: systemctl list-units '*nginx*'.

enable не запустил службу сейчас

enable только ставит автозапуск на будущее (создаёт симлинк). Чтобы запустить сразу — start отдельно или enable --now одной командой.

Служба перезапускается сама по себе (restart loop)

Значит она падает после старта, а systemd настроен её перезапускать (Restart= в unit-файле). Причина — в журнале: journalctl -u <служба> -e.

Warning: some journal files were not opened due to insufficient permissions.

Строки журнала в systemctl status видны только с sudo или пользователю из групп adm и systemd-journal. Без прав status печатает состояние и это предупреждение. Повтори с sudo — см. systemctl и journalctl.

Не понимаю разницу между «служба», «демон» и «юнит»

Демон — фоновый процесс в общем смысле (термин старше systemd). Юнит — объект, которым управляет systemd; служба (.service) — самый частый тип юнита, но есть и другие (.socket, .timer, .mount). Служба почти всегда запускает демон.

См. также

  • systemd — Init-система и менеджер служб — юниты, цели, сокеты, таймеры.
  • systemctl — Управление службами systemd — start/stop/restart/status/enable/reload.
  • journalctl — Чтение журнала systemd (journald) — фильтры по службе, времени, приоритету.
Загрузка…