最直接查进程已运行多久用 ps -eo etime,输出格式为 [[dd-]hh:]mm:ss,表示进程自启动以来的存活时长(非cpu时间);配合 lstart 可查看具体启动时刻,二者组合使用可识别是否被重启。

ps -eo etime 显示进程已运行多久
用 ps -eo etime 是最直接查“进程从启动到现在过了多久”的方式,输出单位是 [[DD-]hh:]mm:ss 格式。注意它统计的是**进程存活时长**,不是 CPU 占用时间,也不含子进程。
-
etime和etimes(秒数)都从进程fork()那一刻开始计,哪怕进程长期 sleep 也继续累加 - 若只查某个 PID,写成
ps -p 1234 -o etime,避免全量扫描影响性能 - 别和
time命令混淆:time测的是命令执行耗时,etime测的是进程生命周期长度 - 某些容器内进程的
etime可能异常小(如 00:00:00),因为容器 runtime 重置了启动时间戳
ps -eo lstart 看进程具体启动时刻
lstart 输出完整日期时间(如 Mon Sep 8 10:22:15 2026),比 etime 更适合做跨时段比对或审计。
- 配合
grep快速定位某时段启动的进程:ps -eo pid,lstart,cmd | grep "Sep 8 10:" -
lstart来自 /proc//stat 的第 22 字段,精度取决于系统时钟,不依赖 shell history - 如果看到时间早于系统重启时间(
uptime显示 17 天,但lstart是 20 天前),说明该进程是 init 进程的子进程或被reparent过
top 的 TIME+ 列实际是累计 CPU 时间
很多人误以为 top 的 TIME+ 是进程存活时长,其实它是该进程及其所有子线程在 CPU 上执行过的总时间(user + sys),单位仍是 [[DD-]hh:]mm:ss。
- 按
Shift + E并输入 PID 后,TIME+才会高亮显示;默认排序是 CPU%,不是运行时间 - 一个后台常驻进程可能
etime是 5 天,但TIME+只有 2 分钟——说明它大部分时间都在休眠 -
TIME+不会清零,即使进程 fork 出子进程,子进程的 CPU 时间也会计入父进程(除非用CLONE_THREAD)
/proc//stat 里藏着更底层的时间字段
真正想确认细节,得读 /proc/<pid>/stat</pid>。第 22 字段是 lstart 对应的启动时间(自 epoch 起的秒数),第 14/15 字段是 user/sys CPU 时间(单位是 clock tick,需除以 sysconf(_SC_CLK_TCK))。
- 例如:
awk '{print $22}' /proc/1234/stat得到 1757352135,用date -d @1757352135可转为可读时间 - 第 22 字段值不变,但
etime会随进程存活而增长——两者差值就是当前已过去秒数 - 普通用户无法读取其他用户的
/proc/<pid>/stat</pid>,权限不足时会返回空,此时ps也会显示?或省略字段
etime 和 lstart 组合使用最稳妥:先用 lstart 锁定可疑进程的启动时刻,再用 etime 确认它是否真“活”了那么久——有些进程看似启动早,实则被 systemd 重启过,lstart 会暴露这个断点。











