ps -T 不显示线程层级结构,仅列出进程所有线程(LWP)及其状态;Linux 线程平级隶属主线程(PID==TID),无父子关系,但可通过 SPID==PID 识别主线程、STAT 中的 s 标识及 /proc/PID/task/ 验证归属。

ps -T 本身并不直接显示“线程层级结构”(如父子线程树),它只是列出指定进程的所有线程(LWP,Light Weight Process),并附带基本状态信息。Linux 中线程在内核中本质是共享地址空间的独立调度实体(即 task_struct),没有传统意义上的“层级结构”(如进程有明确的父进程,但线程之间默认无父子关系);所有线程都平级地隶属于同一个主线程(即 pid == tid 的那个线程)。
不过,你可以通过组合 ps -T 和其他命令,清晰展示:
✅ 某进程下所有线程的 TID、状态、CPU/内存占用
✅ 区分主线程(LWP == PID)与子线程
✅ 辅助判断运行状态(如 R=运行中、S=睡眠、D=不可中断睡眠等)
? 查看指定进程的所有线程及其状态(核心用法)
ps -T -p <PID>
-
-T:启用线程视图(显示 LWP 列) -
-p <PID>:只显示该进程及其所有线程
? 示例(查看 PID 为 1234 的进程):
ps -T -p 1234
输出示例:
PID SPID TID PPID CLONE_FLAGS NLWP STIME TTY TIME CMD 1234 1234 1234 1233 0x0000000000000000 5 10:22 ? 00:00:00 myapp 1234 1235 1235 1233 0x0000000000000000 5 10:22 ? 00:00:00 myapp 1234 1236 1236 1233 0x0000000000000000 5 10:22 ? 00:00:00 myapp 1234 1237 1237 1233 0x0000000000000000 5 10:22 ? 00:00:00 myapp 1234 1238 1238 1233 0x0000000000000000 5 10:22 ? 00:00:00 myapp
说明:
-
PID:进程 ID(主线程所在进程号) -
SPID:线程的调度 ID(在ps -T中常等同于TID) -
TID:线程 ID(内核 task ID,Linux 下gettid()返回值) -
PPID:该线程的父任务 ID —— 注意:所有线程的 PPID 通常指向其主线程的父进程(不是主线程本身),因此不能靠 PPID 构建线程树 -
NLWP:Number of Light Weight Processes = 线程总数(每行都一样,表示整个进程含 5 个线程) -
STIME:启动时间 -
TIME:CPU 使用时间 -
CMD:命令名 -
STAT(状态列,未显示需加-o stat):关键运行状态
✅ 加上状态列更实用:
ps -T -p 1234 -o pid,spid,tid,stat,time,cmd
常见 STAT 字符含义:
-
R:正在运行或可运行(on run queue) -
S:睡眠(可中断) -
D:不可中断睡眠(如 I/O) -
Z:僵尸线程(极罕见,通常不出现) -
<:高优先级(实时) -
s:线程组 leader(即主线程,对应SPID == PID) -
l:多线程(该进程使用了多线程,所有线程都会标l)
? 提示:主线程可通过
SPID == PID识别,且STAT中带s(如Sl表示多线程+leader+睡眠)
? 进阶:按 CPU 或状态筛选活跃线程
想快速找出“正在运行”的线程:
ps -T -p 1234 -o pid,spid,tid,stat,time,cmd | awk '$4 ~ /^R/ {print}'找所有睡眠中(S/D)的线程:
ps -T -p 1234 -o pid,spid,tid,stat,time,cmd | grep -E ' [SD] '
⚠️ 注意:Linux 没有“线程层级树”,但可查线程归属关系
虽然线程间无父子层级,但你可以确认:
- 所有线程属于同一进程(
PID相同) - 主线程是
TID == PID的那个(也是clone()调用者) -
/proc/<PID>/task/目录下每个子目录是一个线程(以 TID 命名),可读取其状态:ls /proc/1234/task/ # 列出所有 TID cat /proc/1234/task/1235/stat | cut -d' ' -f3 # 获取第 3 字段:状态码(如 R, S)
✅ 总结操作步骤
- 确认目标进程 PID:
pgrep -f "myapp"或pidof myapp - 查看全量线程及状态:
ps -T -p <PID> -o pid,spid,tid,stat,time,cmd - 识别主线程:
SPID值等于PID,且STAT含s - 观察
STAT判断运行态:R=忙,S=空闲等待,D=卡在内核态(如磁盘/锁) - 结合
/proc/<PID>/task/验证或获取更底层信息(如堆栈、打开文件)
不复杂但容易忽略细节。


















