linux - 获取正在运行的服务并输出Linux上的服务版本

标签 linux service rpm systemctl

如何获取在 Linux 上运行的所有服务列表并打印它们的版本?

它需要是以下内容的组合:

获取正在运行的服务列表:

systemctl list-units -t service --state=active --plain --no-legend --no-page

获取每个服务的名称并运行:

rpm -q <service package name>

然后获取一个表或 json 或 csv 类型的输出:

nginx.service   1:1.20.1-2.el7

我正在考虑编写一个 python 脚本来执行此操作,但我想我会在这里询问,以防有一种更 linux/bash 的方法可以轻松完成此操作。

最佳答案

#!/bin/bash

listServices(){
   /bin/systemctl list-units -t service --state=active --plain --no-legend --no-page |
   awk -F[@\.] '{print $1}'
}

CSV

while read -r service;do
   rpm -q "$service" --qf '%{NAME}.service;%{VERSION}\n'
done < <(listServices)|grep -v "not installed"

dbus.service;1.10.24
firewalld.service;0.6.3
...

Json:

echo '['
while read -r service;do
   rpm -q "$service" --qf '{"name": "%{NAME}.service", "version": "%{VERSION}"\},\n'
done < <(listServices)|grep -v "not installed" |sed '$s/,$//'
echo ']'


[
    {
        "name": "dbus.service",
        "version": "1.10.24"
    },
    {
        "name": "firewalld.service",
        "version": "0.6.3"
    },
    {
    ...
]

关于linux - 获取正在运行的服务并输出Linux上的服务版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73018455/

相关文章:

linux - 错误 : SvtAv1Enc not found using pkg-config

linux - "soft/hard nofile"在 Linux 上意味着什么

android - 在 AndroidManifest 中有条件地声明服务

android - Android启动完成无法正常运行Nexus One

Java - 如何获取已安装 RPM 包的列表

linux - 如何在linux中减去两个文件

android - ADB 看不到设备

Android getWritableDatabase() 抛出 NullPointerException

shell - 从 RPM 规范文件中提取 shell 脚本以进行静态分析

linux - 卸载 rpm 时从 PATH 中删除条目