阅读一个找出哪个进程注册了 inotify 观察者的答案,我执行了以下命令
echo 1 | sudo tee /sys/kernel/debug/tracing/events/syscalls/sys_exit_inotify_add_watch/enable
sudo cat /sys/kernel/debug/tracing/trace
文件的输出结果trace
有一个标头,表明第一列应该包含进程的名称(任务?)以及 PID:
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
gmain-1715 [004] .... 23200.386116: sys_inotify_add_watch -> 0xfffffffffffffffe
令人惊讶的是,当我使用 grep 查找多行输出中列出的 PID 时,这些 PID 都不存在ps -ef | grep $THE_PID
(其中 $THE_PID 将为 1715)。另外,任务名称对我来说是未知的,并且也不存在于ps
输出中。
此外,全部的列表是所有元组,例如gmain-<some number>
.不是预期的postgres
或node
。所以呢是这个gmain
过程?/proc/ 中不存在的这些 PID 是什么?当我尝试访问它们时,它们是否具有历史意义?
我懂了gmain
是一件事在 Theodore Ts'o 的这些内核文档中关于跟踪的内容, 所以就是某物。
答案1
这些不是过程。这些都是任务。 Linux 的工作原理是任务。您在 a 中看不到他们的 ID过程列出因为这些任务恰好是进程内的线程。它们是一些多线程的工作线程吉奥某处进行处理。您将在子目录task/
的子目录中找到它们/proc/<process>
(示例/proc/860/task/926
)。
答案2
正如怀疑的那样,这gmain
过程与 GTK 或 Gnome 有关,但需要注意的是,它不是一个过程根本没有,但是一个线(gtk主循环)!这也是 grep 时没有显示的原因ps
。
我在使用-q
选项 to时理解了这ps
一点,它可以让你列出你感兴趣的 pid。出现的 pid 根本不是我作为选项传递的,但在我这样做时仍然显示pstree -p
,这让我想到这一点也许是某种线。
ps
使用我新发现的知识,我发现我可以通过提供选项列出所有也有自己的 PID(这是正确的名称吗?)的线程-L
。
例子:sudo ps -efL -q 906
。
这(和pstree
)让我发现该线程属于NetworkManager
)。