进程所有者 vs 进程用户(Gnome 的系统监视器)

进程所有者 vs 进程用户(Gnome 的系统监视器)

Gnome 的系统监视器在“进程”选项卡中有一个“用户”列。还有一个“所有者”列(默认情况下似乎是隐藏的)。

大多数进程在两列上具有相同的值。然而,有一些则不然。

我想知道每一列到底显示什么,以及两者之间有什么区别。

答案1

systemd 是一个全新的 init 系统(我相信它已经有 4 年历史了)。然而,systemd 包含的内容远不止 PID 1。具体来说,它恰好包括 ConsoleKit 的替代品,ConsoleKit 是管理 TTY 会话、X11 会话以及一般登录的旧软件。 systemd 的 ConsoleKit 替代品称为 logind,并且具有许多优点(例如,多席位终于成为可能,其他我不太确定的事情等)。

现在,systemd <3cgroup秒。 A很多cgroups,又名进程控制组,是 systemd 跟踪哪些进程属于哪个抽象“服务” 1的方式。理解你的问题的关键是,logind这也适用于用户:每个用户会话都有自己的内核“会话”,它由 - 你猜对了 - 一个cgroup.为什么?因为这样内核就能够在用户之间适当地管理资源。仅仅因为一个用户正在运行大量进程并不意味着她应该获得更多的 CPU 时间。但对于cgroups,每个cgroup在处理器上获得相同的时间,因此每个用户都获得相同的资源。

好的,现在我们已经完成了背景。准备好?鉴于上述构建,您问题的实际答案非常平淡:进程“所有者”对应于启动该进程的任何人,无论如何。在技​​术层面上,这是由用户会话跟踪的,并由cgroup.进程“用户”是传统意义上的“用户”:进程运行时使用的身份(以及与该身份相关的所有内容,尤其是权限)。

下面是一个示例:您登录 GNOME 并启动终端。运行 GNOME Shell 和 GNOME 终端以及gnome-session构成 GNOME 的其他所有进程都以用户身份运行:您(因为您已经提供了凭据并登录)并且它也归您所有(因为这是您的错,所以可以说,流程已经开始)。现在让我们说sudo -u例如nobody。您现在正在运行一个进程,该进程已假定 的身份nobody,但在更高的抽象级别上,该进程仍然是由您启动的,并且它仍然附加到您的会话2。该级别由您的用户cgroup3跟踪,这决定了您是“所有者”这一事实。

1:以Apache为例。当 Apache 启动时,它有一个主进程来控制一切,但它也会产生一堆子进程。 Apache 主进程实际上并不做任何工作:它只是指导子进程,并且那些进程是完成所有工作的进程。 (出于各种原因这样做。)Apache“服务”的抽象概念无法直接映射到“Apache”进程的具体概念这一事实给像 systemd 这样的服务管理器带来了问题。这就是cgroups 发挥作用的地方:主要的、原始的 Apache 进程被放入一个控制组中,然后无论它做什么,它都不能曾经逃避那个cgroup。这意味着Apache服务的抽象概念现在可以直接映射到“Apache cgroup”的具体概念。

2:查看/proc/$pid/sessionid有关进程内核会话的一些信息,其中有$pid问题进程的 PID。

3cgroup :您可以通过查看 来了解有关进程的更多信息/proc/$pid/cgroup,其中$pid又是相关进程的 PID。

答案2

“所有者”列与拥有该特定进程所属会话的用户名有关。

摘录-Linux 内核

10.3 会话

每个进程组都处于一个独特的会话中。 (进程创建后,它就成为其父进程会话的成员。)按照约定,会话的会话 ID 等于会话的第一个成员(称为会话领导者)的进程 ID。进程使用系统调用查找其会话的 ID getsid()

每个会话可能有一个控制tty,也称为每个成员进程的控制 tty。通过打开 可以获得控制 tty 的文件描述符/dev/tty。 (当失败时,就没有控制tty。)给定控制的文件描述符tty,可以使用 获得 SID tcgetsid(fd)

会话通常由登录过程建立。登录的终端将成为会话的控制终端。登录进程的子​​进程的所有进程通常都是会话的成员。

这将是“会话”列。该会话 ID 的所有者是“所有者”列。

例子

gnome-system-monitor从 shell运行 GNOME 系统监视器:

    gnome 系统监视器

参考

相关内容