ps 命令需加 -T(或 -L)启用线程视图,并用 -o 显式指定 tid,comm,etime 才能查看线程运行时长;/proc/PID/task/TID/stat 第14字段提供更精确的线程存活时间,需除以 CLK_TCK 换算为秒。

ps 命令加 -T 参数查线程 etime,但默认不显示
ps 本身不直接按线程粒度输出 etime,必须显式启用线程视图并指定字段。常见错误是只用 ps -eL 或 ps -eT,却没加 -o 自定义输出,结果看不到运行时长。
- 加
-T(或-L)才能列出线程,不是进程 - 必须用
-o指定字段,例如tid(线程 ID)、comm、etime -
etime对线程也有效,表示该线程自创建起经过的时间(不是从进程启动算起) - 示例:查看 PID 1234 下所有线程的运行时长:
ps -T -p 1234 -o tid,comm,etime - 注意:
ps -eT -o tid,comm,etime会输出全系统所有线程,量大时建议配合grep过滤
/proc/PID/task/TID/stat 第14字段才是线程真实运行时间
/proc/[PID]/task/[TID]/stat 中第14个字段(从 1 开始数)是线程创建后经历的 clock ticks,比 ps 的 etime 更底层、更精确——因为 ps 的 etime 实际就来自这里,只是做了换算。
- 不同于进程的
/proc/PID/stat(第22字段是进程启动 jiffies),线程用的是第14字段 - 需要除以
CLK_TCK(通常为 100)转成秒:getconf CLK_TCK可确认 - 示例:获取线程 5678 的运行秒数:
awk '{print $14/100}' /proc/1234/task/5678/stat 2>/dev/null - 容易漏掉:路径中的
TID必须和ps -T输出的tid一致,不是pid;且/proc/PID/task/下的目录名就是 TID
top 和 htop 默认不显示线程运行时长,得手动调列
top 的交互模式下按 H 可切到线程视图,但它的 TIME+ 列仍是 CPU 时间总和(user + sys),**不是存活时长**——这点和进程模式完全一样,容易误读。
-
htop更友好:启动后按F2→ “Columns” → 搜索ELAPSED或STARTTIME,勾选后就能看到每个线程的已运行时间 -
htop的ELAPSED字段实际调用的就是etime,和ps -o etime一致 - 如果没装
htop,别硬凑top -H看TIME+,它和你要的“跑了多久”不是一回事
注意线程 etime 和进程 etime 的语义差异
同一个进程下的多个线程,etime 值往往不同——因为线程是动态创建的,不是随进程一起出生。比如主线程 etime 是 3 天,某个 worker 线程可能才 2 小时。
-
ps -o etime对线程返回的是“该线程创建至今”的秒数,不是“所属进程启动至今” - 这意味着:不能用线程
etime反推进程启动时间;也不能假设所有线程etime都等于进程etime - 调试时若发现某线程
etime异常短,大概率是它被池化复用或刚被新建;异常长则可能泄漏未销毁
真正想看线程活了多久,ps -T -p PID -o tid,comm,etime 最快;要精度或写监控脚本,直接读 /proc/PID/task/TID/stat 第14字段更稳。别信 top 的 TIME+ ——它从来就没打算回答“跑了多久”这个问题。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。

















