Saída mais curta do status systemctl

Saída mais curta do status systemctl

Existe uma maneira de obter uma saída mais curta/personalizada do status systemctl? Na verdade, só preciso da linha ativa anexada ao nome do serviço. Então, algo assim:

        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

apenas com feedback de cores. Mas eu me contentaria com isso sem cor. Ou em duas linhas mais uma linha em branco 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

Isso meio que satisfaz o último:

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

Mas isso bagunça as cores, não tem espaço em branco e eu espero que haja uma opção ou configuração systemctl em algum lugar onde eu possa obter exatamente o que quero.

Responder1

Portanto, não existe uma maneira nativa de systemctlformatar a saída dessa maneira, mas podemos fazer isso de qualquer maneira, sendo um pouco criativos com pipes.

Primeiro, precisamos de uma lista de todos os serviços em execução no 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 
...

Sem saída de tempo. Para conseguir isso, temos que invocar systemctl showa unidade com a --property=ActiveEnterTimestampbandeira. Exemplo:

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

Agora, se tivéssemos uma maneira de grampear essa saída no final da systemctlsaída... nós temos!

Esta é uma frase feia, mas dá conta do recado:

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`

Explicar:

  • O cutcomando está dividindo em espaços e pegando o primeiro campo de systemctl, que é o nome do serviço.
  • Entramos em um loop while que canaliza o nome do serviço para uma variável chamada$f
  • Criamos uma variável chamada STARTTIMEque contém a systemctl showsaída com o sinalizador de horário de início.
  • Usamos sedpara retirar o ActiveEnterTimestamp=texto real, dando-nos apenas o tempo.
  • Por fim, temos echoo nome do serviço e o horário de início da limpeza, separados por um espaço.

A saída final é assim:

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

informação relacionada