运行时间最长的进程可通过ps -eo pid,comm,etime --sort=-etime | head -n 10直接查出,其中etime表示进程自启动以来的真实经过时间(秒),按降序排列后首行即为最老进程;lstart仅作辅助验证启动时刻,不可用于排序。

ps 命令能直接查出运行时间最长的进程,不需要额外计算或脚本拼接 —— 关键是用对字段和排序方式。
用 ps -eo pid,comm,etime 按运行时间倒序排列
etime 表示进程从启动到现在的**真实经过时间(elapsed time)**,单位是秒,但 ps 默认输出为 [[dd-]hh:]mm:ss 格式,可直接比大小。
按倒序排就能一眼看到谁最老:
ps -eo pid,comm,etime --sort=-etime | head -n 10
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
-e:选所有进程;-o:自定义输出列;comm是命令名(不含路径),比cmd更干净 -
--sort=-etime中的负号表示降序(最大值在前);不加负号是升序(刚启动的在前) -
head -n 10防止输出刷屏,只看前 10 个最老的 - 注意:
etime是“已运行多久”,不是 CPU 占用时间,和top的TIME+列本质不同 —— 后者是累计 CPU 时间,可能远小于实际运行时长
ps 的 etime 和 lstart 两种时间字段怎么选
想看“活了多久”就用 etime;想确认“具体哪天几点启动的”,得看 lstart:
ps -eo pid,comm,lstart,etime --sort=-etime | head -n 5
-
lstart输出形如Mon Jul 7 08:22:14 2026,可读性强,适合人工核对 - 但
lstart不能直接排序(字符串排序会错),所以必须靠etime排序,再把lstart当辅助列一起输出 - 某些老旧系统(如 CentOS 6)的
ps不支持lstart,但etime几乎全平台可用
为什么不用 top -t 或 htop 查最长运行进程
top -t 确实能按运行时间排序,但它排序依据是 TIME+ 字段 —— 这是**累计 CPU 时间**,不是真实存活时长:
- 一个后台常驻进程(比如
rsyslogd)可能只每秒唤醒一次处理日志,TIME+可能只有几秒,但etime已是几十天 -
htop默认没有ETIME列,需手动按F2 → Columns → 添加 etime,且不支持按该列原生排序(部分版本支持,但行为不稳定) -
top的交互式排序对自动化场景(如写监控脚本)不友好,而ps一行命令即得结构化输出
排查时容易忽略的坑:僵尸进程和内核线程
ps -eo ... 默认包含所有状态进程,但两类要特别留意:
- 僵尸进程(
Z状态)的etime仍会增长,但它早已不干活,只是父进程没回收 —— 看到高etime但%CPU为 0,先ps -eo pid,ppid,stat,comm,etime确认状态 - 内核线程(如
kthreadd、rcu_gp)通常 PID 很小、etime极大(接近系统 uptime),它们不算“用户进程”,是否纳入统计取决于你排查目标 - 如果只想看用户态进程,加
-N排除内核线程:ps -Neo pid,comm,etime --sort=-etime | head -n 10
etime 看似简单,但混用 TIME+、漏掉状态过滤、或误信 top 的排序结果,会让“最长运行进程”的判断完全偏离实际。真正关键的不是找最大数字,而是确认这个数字代表什么时间维度。










