Ubuntu 和 Fedora 上“ps -a”的输出不同

Ubuntu 和 Fedora 上“ps -a”的输出不同

我注意到,ps -a当我在 ubuntu“16.04”和 Fedora 23 上运行该命令时,它会产生不同的输出。根据这两个发行版的手册页,-a 选项应该执行以下操作:

-a 选择除会话领导者(参见 getsid(2))和与终端无关的进程之外的所有进程。

对于 Ubuntu 来说,情况似乎并非如此。

我无法解释这种行为,因为它们似乎具有相同版本的 procps。

Fedora:

  • 名称:procps-ng
  • 版本:3.3.10

乌本图:

  • 软件包:procps
  • 版本:2:3.3.10-4ubuntu2

您知道为什么会发生这种情况吗?我做错什么了吗?

谢谢,BR,

答案1

至少有两种情况。最有可能的是,在 fedora 上ps别名为ps -A(或ps a;没有 - 的 a 导致的行为类似于 -A);这将解释输出格式。在每个系统类型上,which ps这将揭示调用了哪些别名(如果有),而不是直接调用可执行文件。

您可以通过调用程序的完整路径(例如,/bin/ps或者以前导 '\' 开始命令,例如 )来绕过任何别名\ps

更不可能的是,这两个发行版使用不同的标志编译了 ps(导致不同的行为)。我刚刚在 fedora 23 上检查了 ps,它的默认输出与您从 ubunutu 获得的输出相同,所以我认为您设置了一个别名。

别名最有可能设置在文件 ~/.bashrc 中;尽管其他位置也是可能的。您可以alias在终端中输入不带参数的命令来查看当前环境中的别名。

更新:

由于它们没有别名,所以其他东西(显而易见)正在修改行为。以下是一些需要查看的内容,以找出是什么:在每个系统上,在“干净”的环境中运行它们:

env -i ps

看看行为是否发生变化。如果是,那么我们就知道是环境因素改变了它。

在每个系统上,输入以下命令: ps --info

查看字段personality=0xfield 是否为非零,这可以改变输出。注意与该输出的任何其他差异;如果您无法解读差异的含义,请发布它们。

要查看某些内容是否被重新利用ps,请在每个 bash shell 中运行以下命令:

set -x
ps -a

你应该看到类似这样的内容:

+ps -a

回显;如果您看到其他内容,例如+ps aux,则会导致这种情况。这通常是通过别名完成的,但它可能是一个函数。您可以通过运行来关闭 bash spamset +x

在每台机器上检查二进制文件是否是指向其他文件的符号链接,以及是否存在异常(在 Fedora 上,/usr/bin/ps 可能是指向 /bin/ps 的符号链接)

ls -alt /bin/ps
ls -alt /usr/bin/ps

尝试

type ps

在每台机器上,结果应该是相同的,如果没有,则响应结果。

有一些环境变量可以修改 ps 的行为;要查看这些类型man ps;它们位于底部。env在每个操作系统上输入并查看是否设置了任何变量;你可以找到它们:

env | grep 'CMD_ENV\|PS_PERSONALITY\|_XPG'

还有其他的;如果它们没有返回任何内容,或者想弄清楚该设置意味着什么,请参见手册页将它们添加到查询中ps

这里开始讨论细节,如果你仍然一无所知,请检查每个二进制文件头:

readelf -h /bin/ps

如果以上均未显示任何差异,您可以将 /bin/ps 文件复制到其他操作系统并进行比较:

cmp -b /bin/ps /path/to/copy/of/ps

这将输出两个文件之间所有不同的字节。实际值并不重要;重要的是差异的数量。

它们会有所不同;如果只有几个字节的差异,那么这只是 gcc 字段 NT_GNU_BUILD_ID,它对于每个构建都是唯一的,即使是其他方面相同的文件也是如此。如果它们没有实质性的差异,那么这是一种受环境影响的行为,我想不出还有什么可以检查的。

答案2

ps手册页

-a 选择除会话领导者(参见 getsid(2))和与终端无关的进程之外的所有进程。

这种行为是因为与 Ubuntu 相比,Fedora 中附加到终端的进程更多。

  1. Ubuntu
  2. Fedora

相关内容