【问题标题】:How to get the base package install location on Linux?如何获取 Linux 上的基本包安装位置?
【发布时间】:2015-01-21 20:19:27
【问题描述】:

我在 Linux Centos 操作系统上。我知道使用“rpm -qa”会为相应的软件包提供很多安装路径。但是,我只需要包的基本包安装位置。 Linux中是否有任何方法/命令/选项来检索相同的内容?我的代码 sn-p 是检索正在运行的服务列表,安装的相应包如下:-

for i in $(service --status-all | grep -v "not running" | grep -E running\|stopped | awk '{print $1}'); 做 包名=$(rpm -qf /etc/init.d/$i) servicestatus=$(service --status-all | grep $i | awk '{print $NF}' | sed 's/...//g' | sed 's/.//g');

echo $tdydate, $(ip route get 8.8.8.8 | awk 'NR==1 {print $NF}'), $i, $packagename, $servicestatus > "$HOME/MyLog/running_services.csv" 完成

现在,我还需要获取托管正在运行的服务的相应软件包安装位置。有没有办法在获取包名称的同时检索它。请确认。

提前感谢您提供帮助。

问候。

【问题讨论】:

  • 您能否详细说明 基本包安装位置 的含义? RPM 会根据它们所包含的内容在各处安装东西。除非您告诉包管理器 (yum, rpm) 使用不同的位置,否则所有 RPM 安装都将相对于 /。我不清楚你想弄清楚什么。
  • 嗨,基本上我需要的是:- 我使用 service --status-all 获得了我的 Centos 上所有已安装服务的列表。现在,对于每一个服务,我都需要知道在linux上对应的应用包位置。

标签: service centos package rpm


【解决方案1】:

您正在寻找 --whatprovides 而不是 -qf(它会进行格式化)。

调整您的示例...

for i in $(chkconfig --list | awk '{ print $1}'); do service $i status >/dev/null 2>&1; if [ 0==$? ]; then echo -n "$i: "; rpm -q --whatprovides /etc/init.d/$i; fi; done | sort

仅供参考 - 这不适用于更现代的基于 systemd 的系统 (CentOS 7)。

我的 Fedora 21 盒子上的示例:

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

netconsole: initscripts-9.56.1-5.fc21.x86_64
network: initscripts-9.56.1-5.fc21.x86_64

【讨论】:

  • 我是那些不能不顾一切的人之一。又快又脏的systemd 版本:systemctl list-dependencies default.target --plain | egrep \\.service | cut -c3- | xargs -IXXX rpm -q --whatprovides /usr/lib/systemd/system/XXX 2>/dev/null | sort -u
【解决方案2】:

好的,您在 cmets 中对我的问题的回答对我来说比您最初的问题要清楚得多...

嗨,基本上我需要的是:- 我使用 service --status-all 获得了 Centos 上所有已安装服务的列表。现在,对于每一个服务,我都需要知道在linux上对应的应用包位置。

...我会提出这个建议(在 CentOS 6.6 上测试):

#!/bin/bash for i in `chkconfig --list | awk '{ print $1}'`; do service $i status >/dev/null 2>&1 if [ $?==0 ]; then rpm -qf /etc/init.d/$i fi done | sort | uniq

这会吐出当前正在运行的服务的所有 rpm 名称。

关于为什么您当前的方法不起作用的更多细节: service --status-all 不会返回可以可靠解析的信息。例如,此处 VM 上的输出:

acpid (pid 872) is running... auditd (pid 789) is running... Stopped cgred is stopped Checking for service cloud-init:Checking for service cloud-init:Checking for service cloud-init:Checking for service cloud-init:crond (pid 1088) is running... ip6tables: Firewall is not running. iptables: Firewall is not running. Kdump is not operational mdmonitor is stopped netconsole module not loaded Configured devices: lo eth0 Currently active devices: lo eth0 ntpd (pid 997) is running... master (pid 1076) is running... rdisc is stopped restorecond is stopped rsyslogd (pid 809) is running... sandbox is stopped saslauthd is stopped openssh-daemon (pid 988) is running...

有些服务甚至不返回他们的名字(第三行)。有人说stopped,其他人说not running。如果您解析chkconfig --list 的第一列,您就会知道所有服务名称,它们对应于/etc/init.d 中的文件。然后您可以单独查询它们的状态并读取 返回码 ($?),0 表示正在运行的服务(或通常表示在 Unix/Linux 世界中成功),1 或更高表示未运行或未安装或不完整/出现故障的服务。

有了/etc/init.d/ 中的名称,您就可以使用rpm -qf /etc/init.d/<servicename> 查询拥有的包,并得到我认为您正在寻找的东西。

编辑:在循环之后添加| sort | uniq,因为某些包包含多个服务,例如 cloud-init,它在 CentOS 上创建了四种不同的服务。所以你对列表进行排序,然后确保你只得到不同的(uniq)名称。 为我工作:

acpid-1.0.10-2.1.el6.x86_64 audit-2.3.7-5.el6.x86_64 cloud-init-0.7.5-10.el6.centos.2.x86_64 cronie-1.4.4-12.el6.x86_64 cyrus-sasl-2.1.23-15.el6_6.1.x86_64 initscripts-9.03.46-1.el6.centos.1.x86_64 iptables-1.4.7-14.el6.x86_64 iptables-ipv6-1.4.7-14.el6.x86_64 iputils-20071127-17.el6_4.2.x86_64 kexec-tools-2.0.0-280.el6.x86_64 libcgroup-0.40.rc1-15.el6_6.x86_64 mdadm-3.3-6.el6.x86_64 ntp-4.2.6p5-1.el6.centos.x86_64 ntpdate-4.2.6p5-1.el6.centos.x86_64 openssh-server-5.3p1-104.el6_6.1.x86_64 policycoreutils-2.0.83-19.47.el6_6.1.x86_64 postfix-2.6.6-6.el6_5.x86_64 rsyslog-5.8.10-9.el6_6.x86_64 udev-147-2.57.el6.x86_64

【讨论】:

  • 感谢伙伴的回复。但是,下面的输出让我感到困惑。服务显示为未运行,状态代码为“0”。这怎么可能?问题是,当我尝试使用服务“服务名称”状态的返回码获取服务状态时,它返回所有“0”,即在我们停止服务时运行。 [root@rt vbatra]# 服务半径状态 radiusd 已停止 [root@rt vbatra]# 服务半径状态 |回声$? 0 [root@rt vbatra]# 知道这里有什么问题吗?
  • @vipinbatra 不要通过管道进入回声。除非您真的找到 echo 无法打印的内容,否则这将始终成功。 :) 试试service radiusd status ; echo $?(用分号代替管道)。如果这不起作用,您必须查看 /etc/init.d/radiusd 并了解它为什么不返回 0。只需将其与报告正确值的内容进行比较即可。大多数初始化脚本具有几乎相同的结构,因此应该很容易发现问题。
  • 感谢伙伴的快速回复。我会试试这个。干杯!
猜你喜欢
  • 2021-05-20
  • 2014-11-06
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
相关资源
最近更新 更多