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 systemctl
formatar 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 show
a unidade com a --property=ActiveEnterTimestamp
bandeira. 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 systemctl
saí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
cut
comando está dividindo em espaços e pegando o primeiro campo desystemctl
, 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
STARTTIME
que contém asystemctl show
saída com o sinalizador de horário de início. - Usamos
sed
para retirar oActiveEnterTimestamp=
texto real, dando-nos apenas o tempo. - Por fim, temos
echo
o 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