RDP Monster

systemctl: все способы вывести список служб Linux

systemctl: все способы вывести список служб Linux

Главная команда: systemctl list-units --type=service

В любом дистрибутиве с systemd — Ubuntu начиная с 15.04, Debian с 8, RHEL и CentOS с 7, а также Fedora, Arch и openSUSE — каждая служба является юнитом systemd, а systemctl — тот самый инструмент, который их перечисляет:

systemctl list-units --type=service

По умолчанию выводятся все юниты служб, которые systemd держит в памяти: активные, с задачами в очереди или завершившиеся с ошибкой. Команда не показывает службы, которые установлены, но ни разу не запускались. Если вывод не помещается в терминал, systemctl передаёт его в пейджер (less) — нажмите q для выхода или добавьте --no-pager, чтобы печатать сразу в stdout.

В каждой строке пять столбцов:

  • UNIT — имя юнита, например ssh.service. Именно это имя вы передаёте в systemctl status, start и stop.
  • LOAD — корректно ли разобран файл юнита: loaded, not-found, bad-setting, error или masked.
  • ACTIVE — общее состояние: active, inactive, activating, deactivating или failed.
  • SUB — детальное состояние, специфичное для типа юнита: служба может быть running, exited, dead и так далее.
  • DESCRIPTION — читаемое описание из файла юнита.

Пару ACTIVE/SUB нужно читать вместе: active (running) означает, что процесс работает прямо сейчас, а active (exited) — что одноразовая служба успешно выполнилась и завершилась; для задач начальной настройки это нормально и исправлять здесь нечего.

Фильтрация: работающие, упавшие или все

Флаг --state= фильтрует по любому значению LOAD, ACTIVE или SUB и принимает списки через запятую:

# Only services with a live process
systemctl list-units --type=service --state=running

# Everything loaded, including stopped and dead services
systemctl list-units --type=service --all

# Only failures
systemctl list-units --type=service --state=failed

# Combine states
systemctl list-units --type=service --state=running,exited

systemctl --failed — встроенное сокращение для фильтра по failed, и его стоит выполнять рефлекторно на любой машине, куда вы зашли. Для машинно-читаемого вывода --no-legend убирает заголовок и итоговые строки, а --plain — маркеры, так что столбцы остаются стабильными для awk или cut. Для поиска по имени используйте grep: systemctl list-units --type=service --all --no-pager | grep ssh.

Что запускается при загрузке: systemctl list-unit-files

list-units отвечает на вопрос «что работает сейчас?». Чтобы узнать, «что запустится при загрузке», выводите список файлов юнитов, установленных на диске:

systemctl list-unit-files --type=service
systemctl list-unit-files --type=service --state=enabled

Здесь столбец STATE описывает конфигурацию автозапуска, а не текущее состояние:

  • enabled — запускается автоматически при загрузке (или по своему триггеру, если активируется через socket/timer).
  • disabled — установлена, но ничто не запускает её автоматически.
  • static — нет секции [Install]; юнит запускается только как зависимость другого и не может быть включён напрямую.
  • masked — symlink на /dev/null; systemd вообще откажется её запускать.
  • generated — создана во время работы генератором, обычно из устаревшего init-скрипта.

Свежие версии systemd также выводят столбец пресета (VENDOR PRESET или PRESET, в зависимости от версии), показывающий значение по умолчанию для дистрибутива. Ловушка, которую надо помнить: enabled не значит «работает», а disabled не значит «остановлена». Служба может быть отключена, но работать, потому что её запустили вручную, или включена, но мертва, потому что упала. Когда это важно, сверяйте оба списка.

По одной службе: status, is-active, is-enabled

Как только конкретная служба привлекла ваше внимание, изучите её подробнее:

systemctl status nginx
systemctl is-active nginx    # prints: active | inactive | failed
systemctl is-enabled nginx   # prints: enabled | disabled | static | masked
systemctl is-failed nginx

status показывает полную картину: состояния ACTIVE/SUB, главный PID, время работы, потребление памяти, дерево процессов cgroup и последние десять строк журнала. Когда десяти строк мало, идите прямо в журнал: journalctl -xeu nginx (-u фильтрует по юниту, -e переходит в конец, -x добавляет пояснения).

Команды is-* сделаны для скриптов: они выводят одно слово и выставляют соответствующий код возврата — is-active завершается с 0 только если юнит активен, а is-enabled возвращает ненулевой код для отключённых и замаскированных юнитов. Добавьте --quiet, чтобы подавить вывод и оставить только код возврата.

Все перечисленные выше команды вывода работают от непривилегированного пользователя. А вот собственно управление службами — start, stop, enable, disable — требует root, поэтому стоит разобраться, как работают sudo и переключение пользователей в Ubuntu, прежде чем выходить за пределы чтения состояний. Учтите также, что пользовательские юниты живут в отдельном менеджере: systemctl --user list-units --type=service выводит службы, запущенные в вашем собственном сеансе, — именно поэтому некоторые службы кажутся «пропавшими» из системного списка.

Шпаргалка: команды, которыми вы будете пользоваться на практике

КомандаЧто показывает
systemctl list-units --type=serviceАктивные и упавшие службы, находящиеся в памяти
systemctl list-units --type=service --allВсе загруженные службы, включая неактивные
systemctl list-units --type=service --state=runningТолько службы с работающим процессом
systemctl --failedТолько упавшие юниты — ежедневная проверка состояния
systemctl list-unit-files --type=serviceВсе установленные службы и их настройка автозапуска
systemctl list-unit-files --state=enabledЮниты, запускающиеся автоматически при загрузке
systemctl status nameПолная информация об одной службе с последними строками логов
systemctl is-active nameСостояние одним словом плюс удобный для скриптов код возврата
systemctl is-enabled nameНастройка автозапуска для одной службы
service --status-allСписок скриптов /etc/init.d в стиле SysV (режим совместимости)

Сценарии из практики

1. Найти службу, которая постоянно падает

systemctl --failed
systemctl status myapp.service --no-pager -l
journalctl -xeu myapp.service
systemctl reset-failed myapp.service

Начните широко с --failed, затем прочитайте вывод status, чтобы увидеть код выхода и последние строки логов, и только потом углубляйтесь в журнал за полной трассировкой. После устранения первопричины и повторного запуска службы reset-failed очищает устаревшую запись об ошибке, чтобы следующая проверка начиналась с чистого листа.

2. Проверить, что запустится при следующей загрузке

systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}'
systemd-analyze blame

Первая команда даёт чистый список всего, что запустится автоматически, — полезно перед усилением защиты сервера или при поиске того, что вы установили несколько месяцев назад и забыли. systemd-analyze blame затем показывает, сколько времени занял каждый юнит при последней загрузке, и медленные службы сразу бросаются в глаза.

3. Однострочники для скриптов и мониторинга

systemctl is-active --quiet nginx && echo up || echo down
systemctl list-units --type=service --state=running --no-legend --plain | awk '{print $1}'
systemctl show -p ActiveState,SubState nginx
systemctl list-units --type=service -o json   # systemd 246 or newer

show -p выводит пары Key=Value, формат которых не меняется между версиями, а вывод в JSON напрямую подаётся в jq. Если вы ловите себя на том, что повторяете одни и те же проверки при каждом входе, оберните их в небольшой скрипт — наше руководство по .sh-файлам и shell-скриптам объясняет, как превратить именно такой набор команд в переиспользуемый инструмент.

Нет systemd? service --status-all и OpenRC

Прежде чем считать, что systemctl доступен, уточните, что реально работает на машине — проверка ОС и её версии из командной строки занимает десять секунд и сразу говорит, дистрибутив ли это с systemd. Если systemctl отсутствует, у вас SysV init или OpenRC:

service --status-all

В Debian и Ubuntu эта команда проходит по /etc/init.d и печатает [ + ] для работающих, [ - ] для остановленных и [ ? ] для скриптов без команды status. Она по-прежнему работает и в дистрибутивах с systemd через слой совместимости, но видит только init-скрипты, поэтому там лучше использовать systemctl. В Alpine и Gentoo система инициализации — OpenRC: rc-status выводит службы текущего уровня выполнения, а rc-update show показывает, что запускает каждый уровень.

Всё описанное выше предполагает, что у вас есть Linux-машина, где вы обладаете правами root и можете свободно запускать, ломать и восстанавливать службы. Если такая машина нужна для практики — или чистый сервер под реальные задачи — Linux VPS с полным root-доступом от rdp.monster поставляется с выделенными CPU и RAM, неограниченной (fair-use) пропускной способностью, без KYC, и выдаётся примерно через 10 секунд после подтверждения платежа, так что вы сможете выполнить systemctl list-units на своём сервере уже через минуту.

Часто задаваемые вопросы

Почему служба показывает active (exited), а не active (running)?

Это одноразовая служба, которая успешно выполнилась и завершилась, — не ошибка.
Службы с Type=oneshot (или RemainAfterExit=yes) выполняют задачу один раз — монтирование, настройку файрвола, очистку — и завершаются. Тогда systemd сообщает active (exited): юнит выполнился успешно и считается «включённым», но никакого процесса не остаётся. Только демоны вроде nginx или sshd показывают active (running). Если служба, которую вы считаете демоном, показывает exited, посмотрите её файл юнита командой systemctl cat name.service, чтобы понять, как она объявлена.

Что означают цветные точки в выводе systemctl?

Зелёный — активна, белый — неактивна, красный — упала или в состоянии ошибки.
Маркер перед именем юнита в systemctl status и systemctl list-units — быстрый индикатор состояния: зелёный для активных, белый для неактивных или останавливающихся и красный для упавших и ошибочных. Упавшие строки в списках также выделяются красным, поэтому вывод systemctl --failed легко просматривать. В скриптах и логах, где цветовые коды мешают, добавьте --plain или перенаправьте вывод — оформление исчезнет.

Есть ли в systemctl аналог chkconfig --list?

Да — systemctl list-unit-files --type=service заменяет chkconfig --list.
В RHEL и CentOS 7 и новее chkconfig --list заменён на systemctl list-unit-files --type=service, который показывает все установленные службы и их состояние: enabled, disabled, static или masked. Для отдельной службы systemctl is-enabled name заменяет chkconfig name, а systemctl enable name заменяет chkconfig name on. Старая команда может ещё существовать как слой совместимости, но она охватывает только устаревшие SysV-скрипты.

Как запретить службе запускаться при загрузке?

Используйте systemctl disable, чтобы убрать её из автозапуска, или mask, чтобы заблокировать полностью.
Выполните sudo systemctl disable name, чтобы удалить symlink автозапуска; добавьте --now, чтобы сразу же её остановить. Отключённую службу всё ещё можно запустить вручную или подтянуть как зависимость другого юнита. Если нужно, чтобы она не запускалась никогда, используйте sudo systemctl mask name — юнит будет связан с /dev/null, и любая попытка запуска завершится ошибкой. Отменить это можно командой systemctl unmask. Проверьте результат через systemctl is-enabled name.

Adrien Roche — Редактор по инфраструктуре и хостингу

Системный инженер с более чем 10-летним опытом эксплуатации парков Windows Server и Linux. Адриен ведёт документацию по инфраструктуре rdp.monster и пишет наши руководства по RDP, VPS-хостингу, администрированию серверов, сетям и инструментам приватности.

Регистрация в программе для реселлеров

Ваши данные

Если у вас есть вопросы, contact us by clicking here !
Имя и фамилия(Обязательно)
Укажите ваш email — у вас должен быть аккаунт на manager.rdp.monster !

Ваша компания

Укажите адрес вашего сайта, если он у вас есть
Кратко опишите, как вы будете продавать услуги своим клиентам. Например, общаться с людьми на форумах.

Мы используем файлы cookie!

Мы используем файлы cookie, чтобы улучшить ваш опыт просмотра, предлагать персонализированную рекламу или контент и анализировать наш трафик. Нажимая «Принять», вы соглашаетесь с использованием файлов cookie.