确定Linux上打包进程的版本

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

package-manager info <packagename> 

即:

 yum info ntp 

但是,是否有一种“linux约定”的方式来知道正在运行的进程软件包版本是什么?

潜在的情况是,只是安装一个软件包的行为并不能保证它所启动的进程被停止并重新启动(这是一个惯例,但不能保证!)。 所以,我很好奇,如果有办法确定过程的版本…这不一定是当前安装使得过程可用的软件包的版本。

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

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

提供你知道你在找什么,这可能是你可以用来获取数据的最可靠的方法。 如果你不知道你在找什么(只是说所有没有媒体支持的可执行文件的pid),你将不得不采取一些heustic来试图找出原来的执行path的基础上的$ 0名称(可以在执行时由进程修改)。 我认为这是@ Zoredache对checkrestart的build议。

据我所知(和我已经testing) / proc / [pid] / exe文件的行为总是为真 – 即使在那里写入与旧文件名相同path中的新文件名。 / proc / [pid] / exe永远会在原始副本不存在时变成死链接。

这很好,它应该是distro模糊的,因为它不依赖于包pipe理器,但内核的行为方式。

 #!/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 

我也指出这不是你正在寻找的东西,而是它将检测到一个没有媒体支持的可执行文件的进程,它不会为你提供什么特定版本的进程。

您可以使用Puppet执行此操作…指定(需要)特定的软件包版本并重新启动要匹配的服务。 您的其他软件包依赖关系也是如此。

我相信你正在寻找类似于debian-goodies软件包中checkrestart工具的东西 。 它基本上使用查看所有正在运行的进程,并确定它们是否指的是删除的文件。 然后通过search包数据库中的文件,将其与包名相关联。 然后它告诉你哪些服务需要重新启动。

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

这是一个为Gentoo创build的版本。

给这个去吧:

 DAEMON=mysqld WIGGLEROOM=10 ITIME=$(/bin/rpm --queryformat '%{INSTALLTIME}\n' -qf /etc/init.d/$DAEMON) STIME=$(/usr/bin/stat -c %Y /proc/$(/sbin/pidof -s $DAEMON)) if [ -z "$ITIME" -o -z "$STIME" ]; then echo Status unknown. exit -1 fi if [ $(($ITIME-$STIME)) -gt $WIGGLEROOM -o $(($STIME-$ITIME)) -gt $WIGGLEROOM ]; then echo Service not restarted. exit 1 fi exit 0 

只是鞭打这个,所以不要太苛刻,如果有一个明显的错误,但我testing了一下,它似乎为我工作。

如果软件包的安装时间和服务重新启动在$WIGGLEROOM的增量范围内,它会干净地退出; 在其他情况下,会引发错误。 根据守护进程,您可能需要比我用于pidof/etc/init.d/$DAEMON的简单逻辑更加pidof ; 特别是Apache需要一些工作,但是至less可以让你开始工作,而且对我来说mysqld是有效的。

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