Перейти к содержимому
RootPoligon

Процессы и сервисы

Чтение и практика ~10 мин

Ситуация

На учебном сервере есть файл настроек сервиса greeter: порт 8081 (найти его — задача лабы «Навигация по серверу»). Но работает ли сам greeter сейчас? Файл настроек существует, даже если программа давно остановилась. Как отличить «файл есть» от «программа работает и отвечает»?

Программа, процесс, сервис

  • Программа — файл на диске. Например, /usr/bin/sleep или /opt/greeter/greeter.py. Пока её не запустили, она ничего не делает.
  • Процесс — запущенная программа. У каждого процесса есть номер — PID (process ID). Одну программу можно запустить несколько раз — будет несколько процессов с разными PID.
  • Сервис — процесс, которым управляет система: она запускает его при загрузке, перезапускает при падении и записывает его сообщения в журнал. На Ubuntu этим занимается systemd, а команда для управления — systemctl.

Сравнение: программа — рецепт в книге, процесс — блюдо, которое готовят прямо сейчас, сервис — повар на смене, за которым следит администратор: пришёл ли вовремя и не ушёл ли раньше.

Процессы своими глазами

Запустим безобидную программу sleep, которая просто ждёт. Знак & в конце запускает её «в фоне» — приглашение возвращается сразу, а программа продолжает работать:

sleep 600 &

Shell ответит номером задачи в квадратных скобках и PID, например [1] 284. Ваш PID будет другим — это нормально, номера раздаются по порядку.

Список процессов показывает ps. Попросим только процессы sleep и три колонки: PID, пользователь, команда:

ps -o pid,user,cmd -C sleep

Пример вывода (номера у вас другие):

  PID USER     CMD
  284 root     sleep 600

Полный список всех процессов — ps aux; он длинный, его обычно сокращают: ps aux | head -n 5 (символ | передаёт вывод одной команды на вход другой; head оставляет первые строки).

Остановить процесс можно командой kill с его PID. Подставьте свой номер из вывода ps:

kill 284

kill по умолчанию вежливо просит процесс завершиться — как Ctrl+C для программы, которая работает не на переднем плане. Проверьте, что процесса больше нет: ps -o pid,user,cmd -C sleep выведет только заголовок.

Сервисы: systemctl status

Процесс, запущенный вами из терминала, живёт, пока вы его не остановите. Сервисы живут независимо от вас. Посмотрим на сервис, который есть в любой системе с systemd, — журнал системы:

systemctl status systemd-journald --no-pager

--no-pager выводит всё сразу, без постраничного просмотра. Главное — первые строки. Пример для нашего учебного сервиса greeter (из будущей лабы; у вас время, PID и память будут другими):

● greeter.service - Учебный сервис greeter
     Loaded: loaded (/etc/systemd/system/greeter.service; enabled; preset: enabled)
     Active: active (running) since Fri 2026-10-16 10:15:41 UTC; 2min ago
   Main PID: 412 (python3)
     CGroup: /system.slice/greeter.service
             └─412 /usr/bin/python3 /opt/greeter/greeter.py

Как читать:

  • Loaded — systemd знает этот сервис; в скобках — файл с его описанием и слово enabled или disabled: включён ли автозапуск при загрузке сервера. У системных служб бывает static: они стартуют как часть самой системы, и автозапуском вручную не управляют.
  • Active — что с ним сейчас: active (running) — работает; inactive (dead) — остановлен; failed — завершился с ошибкой.
  • Main PID — номер главного процесса сервиса. Тот же номер вы увидите в ps.
  • CGroup — какие процессы принадлежат сервису и какую программу он запустил.

Значок в начале строки подсказывает состояние: ● — работает, ○ — остановлен, × — упал.

Две короткие команды отвечают «да/нет» и удобны для проверки:

systemctl is-active greeter
systemctl is-enabled greeter

Они выводят одно слово: active или inactive; enabled или disabled.

Запуск, остановка и автозапуск

Изменяющие команды — им нужны права root:

КомандаЧто делает сейчасПосле перезагрузки
systemctl start greeterзапускаетне влияет
systemctl stop greeterостанавливаетне влияет
systemctl enable greeterничего не запускаетсервис стартует сам
systemctl disable greeterне останавливаетсервис не стартует
systemctl enable --now greeterвключает автозапуск и запускает сразустартует сам

Самая частая ловушка: сервис запустили (start), он работает, но автозапуск не включили. После перезагрузки сервера всё снова «сломано». Поэтому «работает» проверяют двумя вопросами: работает ли сейчас (is-active) и поднимется ли сам (is-enabled).

restart останавливает и снова запускает сервис — так применяют новые настройки. Перезапуск «на всякий случай», не зная причины проблемы, ничего не объясняет; к этому вернёмся в курсе об агенте.

Самостоятельный шаг

Исходное состояние: терминал учебной песочницы.

  1. Запустите два процесса sleep 600 & и sleep 900 &.
  2. Предскажите, сколько строк (кроме заголовка) покажет ps -o pid,user,cmd -C sleep. Проверьте.
  3. Остановите только тот процесс, который ждёт 900 секунд. Убедитесь, что второй остался.
  4. Выполните systemctl status systemd-journald --no-pager и найдите в выводе три вещи: работает ли сервис, что написано в строке Loaded о его автозапуске, PID главного процесса.

Признак успеха: после шага 3 ps показывает ровно один sleep 600; по шагу 4 вы назвали три значения и знаете, в какой строке каждое из них.

Подсказка 1

В выводе ps колонка CMD показывает команду целиком, вместе с числом секунд — по ней и отличают процессы.

Подсказка 2

kill нужен PID, а не номер задачи [2]. Возьмите число из колонки PID напротив sleep 900.

Подсказка 3

Работает ли — строка Active; автозапуск — слово в скобках строки Loaded; PID — Main PID.

Решение — в answers/04-processes.md. Остановите оставшийся sleep, когда закончите: он безвреден, но порядок в песочнице — хорошая привычка.

Если результат другой

  • bash: kill: (12345) - No such process. Такого PID уже нет: опечатка или процесс завершился сам. Посмотрите ps снова.
  • System has not been booted with systemd as init system. Вы не в учебной песочнице, а в среде без systemd (например, в простом контейнере). В песочнице RootPoligon systemd работает.
  • В systemctl status много строк журнала внизу. Это последние сообщения сервиса — о них следующий урок. Для ответа на вопросы шага 4 достаточно верхних строк.

Проверка понимания

  1. systemctl is-active greeter → active, systemctl is-enabled greeter → disabled. Что будет после перезагрузки сервера и какой одной командой это исправить?
  2. Файл /etc/greeter/greeter.conf существует. Значит ли это, что greeter работает? Как проверить?

Ответы — в answers/04-processes.md.

Дальше: Лаба «Управляем сервисами через systemctl».

Проверка автора и источники

  • Воспроизведено: фоновые процессы, ps -o … -C, ps aux | head, kill — Ubuntu 24.04, локальный контейнер.
  • Не воспроизведено: systemctl status/is-active/is-enabled/start/stop/enable — нет systemd в контейнере проверки; формат взят из документации systemd 255 и согласован с ответами, которые проверяют тесты worker/test/stand.test.ts (inactive, active, disabled, enabled).
  • Источники: man ps, man kill, man systemctl (status, is-active, is-enabled, enable --now), systemctl(1).
Разбор и ответы — откройте после своей попытки

Самостоятельный шаг

sleep 600 &
sleep 900 &
ps -o pid,user,cmd -C sleep

Пример вывода (PID у вас другие):

  PID USER     CMD
  301 root     sleep 600
  302 root     sleep 900

Две строки под заголовком — по одной на процесс. Остановить нужно sleep 900, подставив его PID:

kill 302
ps -o pid,user,cmd -C sleep
  PID USER     CMD
  301 root     sleep 600

Допустимая альтернатива: kill %2 — номер задачи shell (если оба процесса запускали в этом же терминале). Недопустимо pkill sleep или killall sleep: остановит оба процесса, а задание просит один.

Шаг 4, systemctl status systemd-journald --no-pager: ожидаемо Active: active (running); в строке Loaded — static: служба стартует как часть системы, команды enable/disable к ней не применяют; Main PID — число. Значения выведены из документации systemd и устройства Ubuntu 24.04, в песочнице курса не воспроизводились — сверить при проверке на стенде.

Остановить оставшийся процесс: kill с его PID.

Проверка понимания

  1. Сейчас работает, но после перезагрузки не запустится. systemctl enable greeter включает автозапуск, не трогая работающий процесс (или enable --now — то же плюс запуск, если он был остановлен).
  2. Нет: файл настроек — это не процесс. Проверка: systemctl is-active greeter (или status) и обращение к самому сервису — в лабе это curl http://127.0.0.1:8081/.

Прочитали и разобрались? Отметьте урок — прогресс сохранится в этом браузере.