Краткий вывод из systemctl status

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

Есть ли способ получить более короткий/кастомизированный вывод от systemctl status? Мне действительно нужна только активная строка с именем сервиса. Что-то вроде этого:

        apache2: active (running) since Thu 2020-02-06 17:20:42 +03; 16min ago
        mongodb: inactive (dead)  since Thu 2020-02-06 17:20:47 +03; 16min ago
rabbitmq-server: active (running) since Thu 2020-02-06 17:20:52 +03; 16min ago
 mongodb-server: active (running) since Thu 2020-02-06 17:20:54 +03; 16min ago
          mysql: active (running) since Thu 2020-02-06 17:20:57 +03; 16min ago

только с цветовой индикацией. Но я бы согласился и без цвета. Или на две строки плюс пустая строка, как:

● apache2.service - The Apache HTTP Server
   Active: active (running) since Thu 2020-02-06 17:20:42 +03; 16min ago

● mongodb.service - An object/document-oriented database
   Active: inactive (dead) since Thu 2020-02-06 17:20:47 +03; 16min ago

● redis-server.service - Advanced key-value store
   Active: active (running) since Thu 2020-02-06 17:20:52 +03; 16min ago

● rabbitmq-server.service - RabbitMQ Messaging Server
   Active: active (running) since Thu 2020-02-06 17:20:54 +03; 16min ago

● mysql.service - MySQL Community Server
   Active: active (running) since Thu 2020-02-06 17:20:57 +03; 16min ago

Этот вариант, кстати, удовлетворяет последнему:

systemctl status apache2.service mongodb.service \
redis.service rabbitmq-server.service mysql.service | grep -e Active -e ●

Но при этом теряется цветовая индикация, нет пробелов, и я как бы ожидаю, что где-то в опциях или конфигурации systemctl есть возможность получить точно то, что я хочу.

Итак, в systemctl нет встроенного способа форматирования вывода таким образом, но мы можем сделать это, проявив немного креативности с помощью пайпов.

Сначала нам нужен список всех активных сервисов в системе:

# systemctl -t service --state=running --no-legend --no-pager

accounts-daemon.service                         loaded active running Accounts Service                                               
atd.service                                     loaded active running Deferred execution scheduler                                   
containerd.service                              loaded active running containerd 
...

Нет вывода времени. Чтобы его получить, мы должны задействовать systemctl show с флагом --property=ActiveEnterTimestamp для юнита. Пример:

# systemctl show accounts-daemon.service --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2019-12-11 21:44:50 UTC

Теперь, если бы у нас был способ прикрепить этот вывод к концу вывода systemctl.. он у нас есть!

Это некрасивый однострочник, но он выполняет задачу:

systemctl -t service --state=running --no-legend --no-pager | cut -d ' ' -f 1 | while read f; do STARTTIME=`systemctl show $f 
--property=ActiveEnterTimestamp | sed 's/ActiveEnterTimestamp=//'`; echo "$f $STARTTIME"; done`

Если объяснить:

  • Команда cut делит на пробелы и берет первое поле из systemctl, которое является именем сервиса.
  • Мы входим в цикл while, который передает это имя сервиса в переменную с именем $f
  • Мы создаем переменную с именем STARTTIME, содержащую вывод systemctl show с флагом времени старта.
  • Мы используем sed, чтобы удалить текст ActiveEnterTimestamp=, оставляя только время.
  • В конце, мы echo имя сервиса и очищенное время старта, разделенные пробелом.

Итоговый вывод выглядит так:

accounts-daemon.service Wed 2019-12-11 21:44:50 UTC
atd.service Wed 2019-12-11 21:44:48 UTC
containerd.service Wed 2019-12-11 21:44:50 UTC

Команда systemctl list-units предоставляет краткий обзор активных сервисов, отображая одну строку на сервис. Вот как это использовать с фильтрацией по шаблону:


# systemctl list-units sp*
  UNIT                         LOAD   ACTIVE SUB     DESCRIPTION              
  spark-history-server.service loaded active running LSB: Spark history-server
  spark-master.service         loaded active running LSB: Spark master
● spark-thriftserver.service   loaded failed failed  LSB: Spark thriftserver
● spark-worker.service         loaded failed failed  LSB: Spark worker

LOAD   = Отражает, правильно ли загружено определение юнита.
ACTIVE = Высокоуровневое состояние активации юнита, т.е. обобщение SUB.
SUB    = Низкоуровневое состояние активации юнита, значения зависят от типа юнита.
4 загруженных юнита перечислено. Используйте --all, чтобы увидеть загруженные, но неактивные юниты.

Используйте --state=running,failed,exited, чтобы показать только определенные сервисы:


# systemctl list-units --state=failed sp*
  UNIT                       LOAD   ACTIVE SUB    DESCRIPTION            
● spark-thriftserver.service loaded failed failed LSB: Spark thriftserver
● spark-worker.service       loaded failed failed LSB: Spark worker

Примечание: systemctl list-units показывает сервисы, которые сейчас в памяти.

Из руководства:


list-units [PATTERN…]

Перечисляет юниты, которые systemd в настоящий момент имеет в памяти. Это
включает юниты, которые либо непосредственно упоминаются, либо включены через
зависимость, юниты, которые закреплены приложениями
программно, или юниты, которые были активны в прошлом и
не прошли. По умолчанию показываются только юниты, которые активны, имеют
ожидающие задачи или не прошли; это можно изменить
с помощью опции –all. Если указаны один или несколько PATTERNs,
показываются только юниты, совпадающие с ними. Юниты, которые
показаны, дополнительно фильтруются –type= и –state=, если
эти опции указаны.

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

Чтобы увидеть все доступные юниты, даже те, которые в настоящий момент не в памяти, вы можете использовать systemctl list-unit-files --type=service. Вот вывод на моей машине с Ubuntu:

# systemctl list-unit-files --type=service
UNIT FILE                              STATE           VENDOR PRESET
apparmor.service                       enabled         enabled      
apport-autoreport.service              static          -            
[email protected]                static          -            
apport.service                         generated       -            
apt-daily-upgrade.service              static          -            
apt-daily.service                      static          -            
apt-news.service                       static          -            
[email protected]                        alias           -            
blk-availability.service               enabled         enabled      
bolt.service                           static          -            
cloud-config.service                   enabled         enabled      
cloud-final.service                    enabled         enabled      
cloud-init-hotplugd.service            static          -            
cloud-init-local.service               enabled         enabled      
cloud-init.service                     enabled         enabled      
console-getty.service                  disabled        disabled     
console-setup.service                  enabled         enabled      
[email protected]               static          -            
cron.service                           enabled         enabled      
cryptdisks-early.service               masked          enabled      
cryptdisks.service                     masked          enabled      
dbus-org.freedesktop.hostname1.service alias           -            
dbus-org.freedesktop.locale1.service   alias           -            
dbus-org.freedesktop.login1.service    alias           -            
dbus-org.freedesktop.resolve1.service  alias           -            
dbus-org.freedesktop.timedate1.service alias           -            
dbus-org.freedesktop.timesync1.service alias           -            
dbus.service                           static          -            
debug-shell.service                    disabled        disabled     
dm-event.service                       static          -            
dmesg.service                          enabled         enabled      
dpkg-db-backup.service                 static          -            
[email protected]                       static          -            
e2scrub_all.service                    static          -            
[email protected]                  static          -  

.

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

Для специалистов в области информационных технологий часто возникает задача оптимизации процессов мониторинга и управления сервисами. Вопрос о том, как получить более короткий и кастомизированный вывод команды systemctl status, особенно актуален в условиях необходимости обеспечения быстрой оценки состояния системных сервисов. Стандартный вывод systemctl status достаточно подробен и содержит большое количество информации, что, однако, может быть избыточным, когда требуется лишь быстрая проверка статуса.

Теория

systemctl — это утилита командной строки, используемая для управления системными и сервисными единицами в операционных системах на базе Systemd. По умолчанию, systemctl status предоставляет детализированную информацию о состоянии сервиса, включая его версию, дату запуска, журнал и другую техническую информацию. Несмотря на это, в ряде случаев требуется получить только ключевые данные, такие как активность сервиса и время, прошедшее с момента его последнего запуска.

Возможности systemctl не предусматривают параметров командной строки для прямой кастомизации формата вывода, который был бы двустрочным и снабжен информацией о статусе и времени запуска. Расширенное использование текстовых утилит UNIX, таких как grep, awk и sed, может помочь в преобразовании стандартного вывода в желаемый формат.

Пример

Примером нестандартного вывода может служить строка:

apache2: active (running) seit Thu 2020-02-06 17:20:42 +03; 16min ago

Для достижения такого результата в командной оболочке Linux можно использовать разнообразные приемы обработки текста. Рассмотрим следующее решение:

systemctl -t service --state=running --no-legend --no-pager | cut -d ' ' -f 1 | while read service; \
do status_info=$(systemctl show $service --property=ActiveState,ActiveEnterTimestamp | sed 's/ActiveState=//' | tr '\n' ' '); \
echo "$service: $status_info"; done

Эта конструкция позволяет пройтись по списку работающих сервисов, определить состояние каждого (например, «active (running)» или «inactive (dead)») и получить соответствующую временную метку.

Применение

Для практического применения таких решений можно воспользоваться скриптами или алиасами в оболочке. В частности, можно создать bash-скрипт, который будет выполнять приведенные команды, форматируя вывод в удобный для чтения вид. Это позволит системным администраторам и инженерам быстро получать нужную информацию о состоянии сервисов.

Пример простого скрипта:

#!/bin/bash

services=$(systemctl -t service --state=active --no-legend --no-pager | cut -d ' ' -f 1)

for service in $services; do
    status=$(systemctl show $service --property=ActiveState --value)
    timestamp=$(systemctl show $service --property=ActiveEnterTimestamp --value)
    echo -e "$service: $status since $timestamp"
done

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

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

Таким образом, даже в отсутствии встроенной поддержки необходимого форматирования вывода в systemctl, комбинированное использование утилит командной строки предоставляет гибкие инструменты для достижения нужного результата, оптимизируя повседневные операции управления сервисами в современных IT-инфраструктурах.

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

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