解析 pstree 输出以列出给定进程名称的父进程和子进程的 PID

解析 pstree 输出以列出给定进程名称的父进程和子进程的 PID

我正在运行名为 的程序的两个实例SMU,因此将有两个具有相同名称的独立进程SMU。并且每个SMU进程将创建一个(可以超过 1 个)子进程,因此现在将有 4 个具有相同进程名称的进程,如下所示(其中 22313、23835 是两个不同实例的父进程)。

22313 pts/10   00:35:00 SMU
22314 pts/10   00:35:06 SMU
23835 pts/6    00:25:02 SMU
23836 pts/6    00:24:56 SMU

我想编写一个单独的 C 代码,为每个实例创建一个链接列表,以SMU列出该进程树的所有 PID。
所以我需要知道如何找到正在运行的实例数?如何找到同名的 PID?哪个进程属于哪个进程组以及该进程是子进程还是父进程?

是否有任何 C API 可以为我完成这项工作?如果我必须使用pstree,我该如何使用它来满足我的要求。

答案1

尝试解析面向用户的命令的输出通常会成为程序中最脆弱的部分,而且是相当脆弱的。(尤其是像 pstree 输出这样复杂的内容。)输出是为人类准备的,不适合计算机使用。它可能在不同程序版本之间发生变化,或者取决于系统区域设置(日期、语言、字符集),或者取决于用户的本地自定义。不要解析 pstree。

在Linux上,枚举进程的主要方法-来源这些信息– 正在列出子目录/进程名称均为数字。每个这样的目录都代表一个进程,其名称为 PID。可以通过读取/proc/<pid>/status和查找PPid:属性(以及Pid:其自身)来确定其父级。

为了更方便地执行此操作,您可以使用libprocps新 API- procps_proctab_read(), 或者旧 APIreadproc(),。readproctab3()

要管理服务的多个实例,请使用服务管理器。大多数 Linux 系统都包含一个服务管理器(称为 systemd)。它会自动跟踪哪些进程属于哪个服务,以便命令systemctl restart smu@foo(以及相应的 C API)始终选择正确的 PID。

相关内容