systemctl status 的输出较短

kaa*_*n_a 4 systemctl

有没有办法从 systemctl 状态获得更短/自定义的输出?我实际上只需要在活动行前面加上服务名称。所以像这样:

\n\n
        apache2: active (running) since Thu 2020-02-06 17:20:42 +03; 16min ago\n        mongodb: inactive (dead)  since Thu 2020-02-06 17:20:47 +03; 16min ago\nrabbitmq-server: active (running) since Thu 2020-02-06 17:20:52 +03; 16min ago\n mongodb-server: active (running) since Thu 2020-02-06 17:20:54 +03; 16min ago\n          mysql: active (running) since Thu 2020-02-06 17:20:57 +03; 16min ago\n
Run Code Online (Sandbox Code Playgroud)\n\n

仅具有颜色反馈。但我会接受没有颜色的。或者在两行加上一个空行,例如:

\n\n
\xe2\x97\x8f apache2.service - The Apache HTTP Server\n   Active: active (running) since Thu 2020-02-06 17:20:42 +03; 16min ago\n\n\xe2\x97\x8f mongodb.service - An object/document-oriented database\n   Active: inactive (dead) since Thu 2020-02-06 17:20:47 +03; 16min ago\n\n\xe2\x97\x8f redis-server.service - Advanced key-value store\n   Active: active (running) since Thu 2020-02-06 17:20:52 +03; 16min ago\n\n\xe2\x97\x8f rabbitmq-server.service - RabbitMQ Messaging Server\n   Active: active (running) since Thu 2020-02-06 17:20:54 +03; 16min ago\n\n\xe2\x97\x8f mysql.service - MySQL Community Server\n   Active: active (running) since Thu 2020-02-06 17:20:57 +03; 16min ago\n
Run Code Online (Sandbox Code Playgroud)\n\n

顺便说一句,这种满足后者:

\n\n
systemctl status apache2.service mongodb.service \\\nredis.service rabbitmq-server.service mysql.service | grep -e Active -e \xe2\x97\x8f\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它搞乱了颜色,没有空白,我有点希望有一个 systemctl 选项或配置,我可以在其中得到我想要的东西。

\n

Kar*_*aru 7

因此,没有本地方法可以以systemctl这种方式格式化输出,但我们无论如何都可以通过对管道进行一些创意来做到这一点。

首先,我们需要系统上所有正在运行的服务的列表:

# 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 
...
Run Code Online (Sandbox Code Playgroud)

没有时间输出。为了实现这一点,我们必须调用systemctl show带有标志的单元--property=ActiveEnterTimestamp。例子:

# systemctl show accounts-daemon.service --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2019-12-11 21:44:50 UTC
Run Code Online (Sandbox Code Playgroud)

现在,如果我们有办法将该输出钉到输出的末尾systemctl......我们就可以了!

这是一句丑陋的俏皮话,但它完成了工作:

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`
Run Code Online (Sandbox Code Playgroud)

解释:

  • 该cut命令按空格分割并从 中获取第一个字段systemctl,即服务名称。
  • 我们输入一个 while 循环,将该服务名称传输到名为的变量中$f
  • 我们创建一个名为的变量STARTTIME,其中包含systemctl show带有开始时间标志的输出。
  • 我们通常sed会删除实际的ActiveEnterTimestamp=文本,只给我们时间。
  • 最后,我们将echo服务名称和清理后的开始时间用空格分隔。

最终输出如下所示:

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
Run Code Online (Sandbox Code Playgroud)