最稳查进程pid和ppid的方法是用ps命令:当前shell用echo "$$"和"$ppid";任意进程如nginx用ps -o pid,ppid,comm -f | grep nginx;查某pid的子进程用ps -o pid,ppid,comm -e | awk '$2==pid'。

直接用 ps 查最稳,别依赖 pstree 或 pidof ——它们要么漏进程,要么分不清父子。
查当前 shell 进程的 PID 和 PPID
终端里直接运行这两条命令就行:
echo "PID: $$" echo "PPID: $PPID"
其中 $$ 是 shell 内置变量,代表当前 shell 的 PID;$PPID 是它的父进程 PID。注意:这仅反映当前 shell 进程,不是你启动的后台程序。
常见误区:
-
$$不等于ps -o pid= -p $!——后者是上一条后台命令的 PID,容易混淆 - 如果在脚本中执行,
$$是脚本所在 shell 的 PID,不是子 shell 或subshell的
查任意进程(如 nginx)的 PID 和其 PPID
用 ps -o pid,ppid,comm -f 最可靠,比如:
ps -o pid,ppid,comm -f | grep nginx
输出类似:
1234 1001 nginx 1235 1234 nginx 1236 1234 nginx
这里 1234 是主进程 PID,1001 是它的 PPID(通常是 systemd 或父 shell);后面两个的 PPID 是 1234,说明它们是子进程。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
关键点:
- 必须加
-f(全格式)或-o pid,ppid,comm显式指定字段,否则默认不显示 PPID -
ps -e包含所有进程,但不含内核线程(如[kthreadd]),它们的 PPID 常为 2,不属于用户进程树 - 避免用
pgrep nginx——它只返回 PID 列表,完全不带 PPID 信息
查某 PID 的所有直接子进程
核心逻辑是:子进程的 ppid 字段必须等于目标 PID。所以:
ps -o pid,ppid,comm -e | awk '$2 == 1234 {print $1, $3}'
这条命令能准确列出 PID 为 1234 的所有直接子进程(包括已僵死的 Z 状态进程)。
为什么比 pstree -p | grep -A2 "1234" 更好?
-
pstree默认只显示当前用户进程,root 启动的服务派生的 worker 往往被过滤掉 - 守护进程常 double-fork,子进程 PPID 变成 1,
pstree把它挂在systemd下,而非原始父进程下 - 僵尸进程(STAT 为
Z)在pstree中不显示,但ps仍保留记录
代码里获取当前进程的 PID/PPID
C/C++ 中用系统调用:
#include <unistd.h>
#include <stdio.h>
int main() {
printf("PID: %d\n", getpid());
printf("PPID: %d\n", getppid());
return 0;
}</stdio.h></unistd.h>
注意:
-
getpid()和getppid()是轻量系统调用,无权限限制 - 子进程 fork 后,
getppid()返回值可能突变为 1(比如父进程提前退出,被 init 收养) - 不要在多线程程序里假设
getppid()始终不变 —— 父进程生命周期可能短于子线程
实际调试时,ps 输出里的 PPID 列才是最终依据,代码里拿到的只是快照。










