Gnome 的系统监视器在“进程”选项卡中有一个“用户”列。还有一个“所有者”列(默认情况下似乎是隐藏的)。
大多数进程在两列上具有相同的值。然而,有一些则不然。
我想知道每一列到底显示什么,以及两者之间有什么区别。
答案1
systemd 是一个全新的 init 系统(我相信它已经有 4 年历史了)。然而,systemd 包含的内容远不止 PID 1。具体来说,它恰好包括 ConsoleKit 的替代品,ConsoleKit 是管理 TTY 会话、X11 会话以及一般登录的旧软件。 systemd 的 ConsoleKit 替代品称为 logind,并且具有许多优点(例如,多席位终于成为可能,其他我不太确定的事情等)。
现在,systemd <3cgroup
秒。 A很多。cgroup
s,又名进程控制组,是 systemd 跟踪哪些进程属于哪个抽象“服务” 1的方式。理解你的问题的关键是,logind
这也适用于用户:每个用户会话都有自己的内核“会话”,它由 - 你猜对了 - 一个cgroup
.为什么?因为这样内核就能够在用户之间适当地管理资源。仅仅因为一个用户正在运行大量进程并不意味着她应该获得更多的 CPU 时间。但对于cgroup
s,每个cgroup
在处理器上获得相同的时间,因此每个用户都获得相同的资源。
好的,现在我们已经完成了背景。准备好?鉴于上述构建,您问题的实际答案非常平淡:进程“所有者”对应于启动该进程的任何人,无论如何。在技术层面上,这是由用户会话跟踪的,并由cgroup
.进程“用户”是传统意义上的“用户”:进程运行时使用的身份(以及与该身份相关的所有内容,尤其是权限)。
下面是一个示例:您登录 GNOME 并启动终端。运行 GNOME Shell 和 GNOME 终端以及gnome-session
构成 GNOME 的其他所有进程都以用户身份运行:您(因为您已经提供了凭据并登录)并且它也归您所有(因为这是您的错,所以可以说,流程已经开始)。现在让我们说sudo -u
例如nobody
。您现在正在运行一个进程,该进程已假定 的身份nobody
,但在更高的抽象级别上,该进程仍然是由您启动的,并且它仍然附加到您的会话2。该级别由您的用户cgroup
3跟踪,这决定了您是“所有者”这一事实。
1:以Apache为例。当 Apache 启动时,它有一个主进程来控制一切,但它也会产生一堆子进程。 Apache 主进程实际上并不做任何工作:它只是指导子进程,并且那些进程是完成所有工作的进程。 (出于各种原因这样做。)Apache“服务”的抽象概念无法直接映射到“Apache”进程的具体概念这一事实给像 systemd 这样的服务管理器带来了问题。这就是cgroup
s 发挥作用的地方:主要的、原始的 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
,可以使用 获得 SIDtcgetsid(fd)
。会话通常由登录过程建立。登录的终端将成为会话的控制终端。登录进程的子进程的所有进程通常都是会话的成员。
这将是“会话”列。该会话 ID 的所有者是“所有者”列。
例子
gnome-system-monitor
从 shell运行 GNOME 系统监视器: