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, systemctl
die 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 show
die Einheit mit dem --property=ActiveEnterTimestamp
Flag 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
cut
Befehl wird in Leerzeichen aufgeteilt und übernimmt das erste Feld vonsystemctl
, 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
STARTTIME
enthält .systemctl show
sed
Normalerweise entfernen wir den eigentlichenActiveEnterTimestamp=
Text und erhalten nur die Zeit.- Zum Schluss noch
echo
der 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