确定 Linux 上打包进程的版本

确定 Linux 上打包进程的版本

很容易知道在 Linux 发行版上安装了哪个版本的软件包:

package-manager info <packagename>

IE:

yum info ntp

但是,有没有一种“Linux 惯例”的方式来知道正在运行的进程的软件包版本是?

可能的情况是,仅仅安装一个软件包并不能保证由它启动的进程会停止并重新启动(这是一个常见的惯例;但没有保证!)。所以,我很好奇是否有办法确定进程的版本……不一定是当前安装的使进程可用的软件包的版本。

答案1

您可以检查是否存在/proc/[pid]/exe如果存在,您就知道该进程正在运行正确的版本。

如果 exe 指向的源文件已被覆盖/proc/[pid]/exe变为死链接。

为您提供知道您要查找的内容 这可能是获取数据的最可靠方法。如果您不知道要查找的内容(例如,仅查找所有没有媒体支持的可执行文件的 pid),则必须使用一些启发式方法尝试根据进程的 $0 给定名称(进程在执行时可以更改该名称)找出进程的原始执行路径。我认为这就是 @Zoredache 建议的 checkrestart 所做的。

据我所知(并且我已经测试过),这种行为/proc/[pid]/exe始终是正确的——即使新文件名与旧文件名位于同一路径中。/proc/[pid]/exe当原始副本消失后总会变成死链接。

它的优点在于它应该是发行版模糊的,因为它不依赖于包管理器,而是依赖于内核的行为方式。

#!/bin/sh
if [ -z "$1" ]; then
        echo "Specify a process-id" >&2
else
        PID=$1;
fi

PATH=$(readlink /proc/${PID}/exe);

if [ $? -ne 0 ]; then
        echo "No path for this process! Process is likely running an old copy!" >&2
else
        echo "Points back to ${PATH} and is running the latest copy"
fi

我还要指出的是,这不会确切地您正在寻找什么,虽然它会检测到没有媒体支持可执行文件的进程,但它不会为您提供该进程可能的具体版本。

答案2

您可以使用 Puppet 执行此操作...指定(需要)特定软件包版本并重新启动服务以匹配。其他软件包依赖项也可以这样做。

答案3

checkrestart我相信你正在寻找类似于debian 好东西包。它基本上会查看所有正在运行的进程并确定它们是否引用已删除的文件。然后,它通过在包数据库中搜索文件将其与包名称关联起来。然后它会告诉您需要重新启动哪些服务。

如果您没有运行基于 Debian 的发行版,那么我建议您可以下载源代码(python)并尝试使该工具适应您的环境。或者您可以弄清楚它在做什么并直接调用 lsof。

这是某人的版本为 Gentoo 创建。

答案4

一旦可执行文件进入内存,文件系统上的实际版本可能会有所不同。所以不行。

相关内容