¿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 systemctl
formatear 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 show
contra la unidad con la --property=ActiveEnterTimestamp
bandera. 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 systemctl
salida... ¡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
cut
comando se divide en espacios y toma el primer campo desystemctl
, 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
STARTTIME
que contiene lasystemctl show
salida con el indicador de hora de inicio. - Solemos
sed
quitar elActiveEnterTimestamp=
texto real, dándonos solo la hora. - Finalmente,
echo
separamos 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