Вопрос или проблема
Есть ли способ получить более короткий/кастомизированный вывод от 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-инфраструктурах.