Kürzere Ausgabe vom Systemctl-Status

Kürzere Ausgabe vom Systemctl-Status

Gibt es eine Möglichkeit, kürzere/benutzerdefinierte Ausgaben von systemctl status zu erhalten? Ich brauche wirklich nur die aktive Zeile mit dem Namen des Dienstes als Voranstellung. Also so etwas wie das hier:

        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

nur mit Farbfeedback. Aber ich würde mich auch mit ohne Farbe zufrieden geben. Oder auf zwei Zeilen plus einer Leerzeile wie:

● 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

Dies erfüllt übrigens irgendwie Letzteres:

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

Aber es bringt die Farben durcheinander, es fehlen die Leerzeichen und ich erwarte irgendwie, dass es irgendwo eine Systemctl-Option oder -Konfiguration gibt, mit der ich genau das bekomme, was ich will.

Antwort1

Es gibt also keine native Möglichkeit, systemctldie Ausgabe auf diese Weise zu formatieren, aber wir können es trotzdem tun, indem wir mit Pipes etwas kreativ werden.

Zuerst benötigen wir eine Liste aller laufenden Dienste auf dem System:

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

Keine Zeitausgabe. Um diese zu erhalten, müssen wir systemctl showdie Einheit mit dem --property=ActiveEnterTimestampFlag aufrufen. Beispiel:

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

Wenn wir jetzt nur eine Möglichkeit hätten, diese Ausgabe an das Ende der Ausgabe anzuheften systemctl… wir haben eine!

Das ist ein hässlicher Einzeiler, aber er erfüllt seinen Zweck:

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`

Erklären:

  • Der cutBefehl wird in Leerzeichen aufgeteilt und übernimmt das erste Feld von systemctl, welches den Dienstnamen darstellt.
  • Wir geben eine While-Schleife ein, die den Dienstnamen in eine Variable namens$f
  • Wir erstellen eine Variable mit dem Namen , die die Ausgabe mit dem Startzeitflag STARTTIMEenthält .systemctl show
  • sedNormalerweise entfernen wir den eigentlichen ActiveEnterTimestamp=Text und erhalten nur die Zeit.
  • Zum Schluss noch echoder Dienstname und die bereinigte Startzeit, getrennt durch ein Leerzeichen.

Die endgültige Ausgabe sieht folgendermaßen aus:

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

verwandte Informationen