Процессы и сервисы
Чтение и практика ~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 останавливает и снова запускает сервис — так применяют новые настройки. Перезапуск
«на всякий случай», не зная причины проблемы, ничего не объясняет; к этому вернёмся в курсе об агенте.
Самостоятельный шаг
Исходное состояние: терминал учебной песочницы.
- Запустите два процесса
sleep 600 &иsleep 900 &. - Предскажите, сколько строк (кроме заголовка) покажет
ps -o pid,user,cmd -C sleep. Проверьте. - Остановите только тот процесс, который ждёт 900 секунд. Убедитесь, что второй остался.
- Выполните
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 достаточно верхних строк.
Проверка понимания
systemctl is-active greeter→active,systemctl is-enabled greeter→disabled. Что будет после перезагрузки сервера и какой одной командой это исправить?- Файл
/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.
Проверка понимания
- Сейчас работает, но после перезагрузки не запустится.
systemctl enable greeterвключает автозапуск, не трогая работающий процесс (илиenable --now— то же плюс запуск, если он был остановлен). - Нет: файл настроек — это не процесс. Проверка:
systemctl is-active greeter(илиstatus) и обращение к самому сервису — в лабе этоcurl http://127.0.0.1:8081/.
Прочитали и разобрались? Отметьте урок — прогресс сохранится в этом браузере.