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