Более короткий вывод из systemctl status

Более короткий вывод из 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 или конфигурация, с помощью которой я могу получить именно то, что хочу.

решение1

Итак, нет встроенного способа 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

Связанный контент