我有一个在 VirtualBox 6.0 上运行的 CentOS 8 (3.10)...我有 2 个关于 WCHAN 的问题
“ps”手册页将 WCHAN 描述为:
Blockquote nwchan 进程正在休眠的内核函数的 WCHAN 地址(如果需要内核函数名称,请使用 wchan)。正在运行的任务将在此列中显示破折号(“-”)。
Blockquote wchan 进程正在休眠的内核函数的 WCHAN 名称,如果进程正在运行,则为“-”;如果进程是多线程且 ps 不显示线程,则为“*”。
我还没有看到“*”,但我会看到“?”有规律地出现在“ps”命令的输出中。通常与rcu_sched内核进程相关,但是“?”确实出现在其他进程中。我还没有找到“?”的定义......它是什么意思?
我的第二个问题是关于我在“ps”命令和“系统监视器”GUI 实用程序的输出之间看到的差异。在“ps”命令下,我将看到几个处于运行状态的进程,并且在 WCHAN 下有一个“-”。然而,在“系统监视器”下,这些相同的进程将处于运行状态,WCHAN 代码为“poll_schedule_timeout”。从我读到的内容来看,这表明一个进程正在等待 I/O...这些进程不应该处于睡眠状态吗?
答案1
问号“?”在“ps”输出中
我没有检查 Linux 上“ps”的源代码,但恕我直言,“?”当“ps”未知该值时始终使用。为什么碰巧你在不了解更多细节的情况下无法回答。
但最常见的原因是缺少权限:“ps”进程的用户没有读取其他进程的详细信息的权限。其他进程的详细信息可以在例如/proc/PIDNUMBER/
目录中检查 - 如果您没有权限查看详细信息,那么您启动的“ps”进程也会有相同的权限问题。
“ps”和“系统监视器”的不同输出
不幸的是,这无法准确回答。其实我会总是期望两个“ps”实例或“系统监视器”或任何其他工具显示不同的输出当前的进程状态,因为系统中大多数进程的状态每过一秒就会发生变化!每次运行“ps”等工具时,您都会获得此时状态的快照。
即使您尝试同时启动两个“ps”实例,几乎每个系统上的输出也会有所不同,因为“ps”本身只是一个从 Linux/Unix 内核获取一些时间片的进程,从而导致两个“ps”进程在不同时间从其他进程获取数据,从而获取不同的值。
理论上,如果您的系统有 200 个 CPU 核心且只有 198 个进程,则有两个(新的)“ps”进程可以显示相同的输出。理论上 - 如果两个进程都在自己的 CPU 核心上运行并且同时启动!
测试输出:
通常进程的状态会频繁切换。唯一可以保持一段时间的状态是“停止”。这在“ps”中显示为“T”(sToppped)。要在此处比较“ps”和“系统监视器”,您可以尝试向进程发送停止信号,kill -STOP PIDNUMBER
然后比较该进程的两个工具的输出。要在比较后继续执行进程,只需使用 向其发送“继续”信号kill -CONT PIDNUMBER
。作为一个过程,您可以使用诸如“sleep 3600”之类的东西,它可以在“ps”输出中轻松找到(或“grep”ped)。