如何判断一个进程是否是系统进程?

如何判断一个进程是否是系统进程?

我正在读取/proc目录(或伪文件系统)来查找所有进程。我正在从中获取所需的信息,/proc/[pid]/status但我还需要其他东西。有什么方法可以找出哪些进程对系统至关重要?例如使用进程的parent-pid 或UID?

我所说的系统进程是指在操作系统的全新安装上以及安装任何应用程序或服务之前存在的进程。这可能根本不意味着内核线程或系统进程,但总而言之,我的意思是进程,它们的终止,破坏系统的基本结构。

附言。我正在开发一个 Android 应用程序,但由于这部分是使用纯 Linux 文件系统完成的,所以我在这里询问了它,我认为不会有任何不同。

答案1

如果有,htop您可以按Shift+k来切换内核线程的显示。如果您F5按树模式,它们应该全部显示为 的子级kthreadd

那里内核线程和用户空间线程之间的一些明显差异:

  • /proc/$pid/cmdline对于内核线程为空——这是 ps 和 top 用来区分内核线程的方法。

  • 符号/proc/$pid/exe链接没有内核线程的目标 - 这是有道理的,因为它们在文件系统上没有相应的可执行文件。

更具体地说,readlink()ENOENT尽管链接本身存在,但系统调用返回(“没有这样的文件或目录”),以表示该进程的可执行文件不存在(并且从未存在过)。

因此,检查内核线程的可靠方法应该是调用readlink()/proc/$pid/exe检查其返回代码。如果成功则为$pid用户进程。如果失败并显示ENOENT,则额外的stat()on/proc/$pid/exe应该可以区分内核线程和刚刚终止的进程的情况。

  • /proc/$pid/status大多数内核线程缺少几个字段 - 更具体地说,是一些与虚拟内存相关的字段。

以上回答来自识别内核线程

另一种区分内核线程与其他进程的方法是运行top -c。从top手册:

3. 命令 -- 命令名称或者命令行
显示用于启动任务的命令行或关联程序的名称。您可以使用“c”在命令行和名称之间切换,它既是命令行选项,也是交互式命令。

当您选择显示命令行时,没有命令行的进程(如内核线程)将仅显示在括号中的程序名称,如下例所示:
[ mdrecoveryd ]

运行ps aux还会显示在没有方括号中的命令的情况下启动的进程(并且将有一个空/proc/[pid]/cmdline文件)。

例子:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        19  0.0  0.0      0     0 ?        S<   Mar02   0:00 [kworker/1:0H] 

查看包装procps-3.2.8文件/proc/readproc.h

// Basic data structure which holds all information we can get about a process.
// (unless otherwise specified, fields are read from /proc/#/stat)
//
// Most of it comes from task_struct in linux/sched.h

答案2

你不能。 “系统进程”并不是一个明确定义的概念。 “对系统至关重要”并不是一个普遍的、是或否的属性。

我是在台式电脑上写这篇文章的。它安装了 Apache,但它在这台机器上并不是“对系统至关重要”——我只是偶尔用它来测试一些东西。另一方面,在面向公众或企业的 Web 服务器上,Apache 是必不可少的。相反,X 服务器在大多数服务器上并不重要,但在工作站上却是必不可少的。

没有捷径。如果你想知道杀死一个进程是否会破坏任何东西,你需要明白该进程正在做什么。如果您不知道某个进程正在做什么,请假设它很关键。

“在全新安装操作系统时以及安装任何应用程序或服务之前存在的进程”也不是一个明确定义的概念。即使服务不是默认安装的一部分(例如 Apache),它们对于特定系统也可能至关重要。相反,服务可能包含在默认安装中,但对于特定系统而言并不重要(例如,没有网络连接的系统上的网络管理服务)。

在 Android 上,它不是 Linux 系统(它是使用 Linux 内核的不同系统),您可以调用任何在/system“系统进程”上运行的东西。与 Unix 不同,这个定义在 Android 上有些意义,因为它明确地将基本系统与用户安装的应用程序分开。基本系统包括预装的应用程序(电话、Gmail 等),根据电话供应商(制造商或网络运营商)的不同,有不同的选择。此定义的一个变化是,运行/data中但存在条目的应用程序/system/app根据此定义也是“系统”应用程序,只是已升级的应用程序。

答案3

是的,在 /proc/[pid]/status 中有 UID 条目。如果输入等于:

UID:    0    0    0    0
UID: real UID, effective UID, saved set UID, file system UID

这意味着进程属于root。

此外,大多数根进程的父进程 pid(PPid) 范围为 0 到 2。

相关内容