Salida más corta del estado systemctl

Salida más corta del estado systemctl

¿Hay alguna manera de obtener una salida más corta/personalizada del estado systemctl? Realmente solo necesito la línea activa precedida por el nombre del servicio. Entonces algo como esto:

        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

Solo con retroalimentación de color. Pero yo me conformaría con ello sin color. O en dos líneas más una línea en blanco como:

● 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

Este tipo de satisfacción satisface este último por cierto:

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

Pero estropea los colores, no tiene espacios en blanco y espero que haya una opción o configuración systemctl en algún lugar donde pueda obtener exactamente lo que quiero.

Respuesta1

Por lo tanto, no existe una forma nativa de systemctlformatear la salida de esta manera, pero podemos hacerlo de todos modos siendo un poco creativos con las canalizaciones.

Primero, necesitamos una lista de todos los servicios en ejecución en el sistema:

# 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 
...

Sin salida de tiempo. Para conseguirlo tenemos que invocar systemctl showcontra la unidad con la --property=ActiveEnterTimestampbandera. Ejemplo:

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

Ahora bien, si tan solo tuviéramos una manera de grapar esa salida al final de la systemctlsalida... ¡la tenemos!

Esta es una frase fea, pero hace el trabajo:

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`

Para explicar:

  • El cutcomando se divide en espacios y toma el primer campo de systemctl, que es el nombre del servicio.
  • Ingresamos un bucle while que canaliza el nombre del servicio a una variable llamada$f
  • Creamos una variable llamada STARTTIMEque contiene la systemctl showsalida con el indicador de hora de inicio.
  • Solemos sedquitar el ActiveEnterTimestamp=texto real, dándonos solo la hora.
  • Finalmente, echoseparamos el nombre del servicio y la hora de inicio de la limpieza con un espacio.

El resultado final se ve así:

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

información relacionada