Как перечислить только имена служб systemd и перебрать их?

Вопрос или проблема

Я хотел бы перебрать имена сервисов systemd, но не могу найти опцию, чтобы выводить только имена сервисов. Я пытался использовать cut, но безуспешно.

._. systemctl list-units | cut -f 1 -d=
  UNIT LOAD   ACTIVE SUB       DESCRIPTION                                                          
 ...
  thermald.service   loaded active running   Thermal Daemon Service
 ...

Как я могу это сделать?

  • Для справки, systemctl list-units --quiet --plain | cut -f1 -d\ работает лучше.
  • Без --plain символ предупреждения в первом столбце сбивает с толку подсчет столбцов с помощью cut.
  • --quiet подавляет легенду внизу.

.

Ответ или решение

Чтобы вывести только имена сервисов systemd и пройти по ним в цикле, необходимо воспользоваться командой systemctl в сочетании с утилитами текстовой обработки. Рассмотрим подробное и пошаговое решение этой задачи.

Шаг 1: Вывод списка юнитов systemd

Команда systemctl list-units по умолчанию выводит полный список юнитов с множеством информации ( например, статус и описание). Чтобы извлечь только интересующие нас имена сервисов, следует использовать следующие ключи:

  • --type=service – выводит только сервисы, исключая таймеры, сокеты и другие юниты.
  • --all – включает в список и неактивные и активные сервисы, если это необходимо.
  • --quiet – подавляет легенду внизу таблицы.
  • --no-pager – отключает использование прокрутки через пейджер.

Шаг 2: Извлечение только имен сервисов

После получения списка юнитов необходимо извлечь только первый столбец, содержащий имена сервисов:

systemctl list-units --type=service --quiet --no-pager --all | awk '{print $1}'

В этом примере используется awk, чтобы извлечь первый столбец. Это более надежный метод по сравнению с cut, особенно в ситуациях, где пробелы или другие символы могут усложнить разделение данных.

Шаг 3: Проход по именам сервисов в цикле

Используйте команду for для перебора полученного списка сервисов:

for service in $(systemctl list-units --type=service --quiet --no-pager --all | awk '{print $1}'); do
    echo "Processing service: $service"
    # добавьте любой код, который необходимо выполнить с каждым сервисом
done

Оптимизация и бизнес-контекст

Данный подход обеспечивает чистый и надежный способ работы со списком сервисов.

  1. Эффективность: Использование awk гарантирует точное извлечение данных, минимизируя вероятность ошибок, которые могут возникнуть из-за нестандартных символов.
  2. Универсальность: Скрипт остается гибким и может использоваться в различных сценариях администрирования.
  3. Автоматизация: Данное решение можно легко интегрировать в более сложные скрипты или инструменты управления системой, что особенно важно в задачах DevOps.

Таким образом, представленный метод не только решает заданную задачу, но и предоставляет прочную основу для автоматизации и управления сервисами в системах Linux с использованием systemd.

Оцените материал
Добавить комментарий

Капча загружается...