要看进程启动了多久,优先用 ps 的 etime 字段(从启动至今的秒数),不支持时改用 lstart 计算;systemd 服务则用 systemctl status 或 show 查 started 时间。

ps 命令怎么看进程启动了多久
直接看 ps 的 etime 和 time 字段最靠谱,但得注意它们含义完全不同:etime 是从进程启动到现在的秒数(含休眠时间),time 是 CPU 实际运行的总时间(单位是 1/100 秒)。查“运行了多久”,99% 场景要的是 etime。
常用写法:
ps -eo pid,etime,comm --sort=-etime | head -5
说明:按 etime 降序排,找启动最早的几个进程。注意 --sort=-etime 的负号不能漏,否则是升序。
-
ps -eo是关键,必须用-eo(自定义输出格式),ps aux不带etime - 某些老系统(如 CentOS 6)的
ps版本不支持etime,会报错或显示为空 —— 改用lstart字段转算 -
comm只显示命令名(不含路径),想看完整命令用args,但会截断长命令
用 lstart 算出精确启动时间点
当 etime 不可用,或者你需要知道“具体哪天几点启动的”,就靠 lstart。它输出的是完整日期时间字符串,比如 2024-03-12 14:22:05,可读性强。
示例:
ps -eo pid,lstart,comm | grep nginx
如果你要算已运行多少秒,可以用 date 差值(bash 下):
start=$(ps -o lstart= -p 1234); date -d "$start" +%s 2>/dev/null
说明:先取进程 1234 的 lstart,再转成 Unix 时间戳,和当前 $(date +%s) 相减就是秒数。
-
ps -o lstart= -p PID的=是为了去掉表头,避免干扰解析 - 不同 locale 下
lstart格式可能变化(比如中文系统带“月”“日”字),脚本里慎用直接字符串切片 -
lstart在容器内进程里可能显示宿主机时间,但仍是准确的启动时刻
top 里没法直接看运行时长
top 默认字段里没有 etime 或 lstart,强行加进去很麻烦,而且刷新时会重排,不适合盯住看“这个进程跑了多久”。真要动态监控,不如用 watch 包一层 ps:
watch -n 5 'ps -o pid,etime,comm -C python3'
说明:每 5 秒刷新一次所有 python3 进程的 etime,一眼看出谁刚起来、谁快跑了一天。
-
-C按命令名匹配,比grep python更干净,不会误中grep python自身 -
watch默认用sh执行命令,如果用了 bash 特性(如数组),得显式写watch -n 5 'bash -c "..."' -
top的TIME+列是累计 CPU 时间(毫秒级),不是运行时长,别混淆
systemd 服务怎么查启动时间
如果进程是 systemd 管理的服务(比如 nginx.service),优先走 systemctl,它记录更权威,还包含启动状态和依赖延迟:
systemctl show --property=ActiveEnterTimestamp nginx.service
或者更直观地:
systemctl status nginx.service | grep "Started"
说明:Started 行是 systemd 日志里记录的实际启动完成时间,比 ps 的 lstart 多几毫秒误差,但对运维足够准。
- 用
systemctl show能拿到 ISO8601 格式时间,适合脚本解析;status输出是给人看的,字段位置不固定 - 如果服务被重启过,
ActiveEnterTimestamp是最近一次启动时间,不是首次安装时间 - 非 systemd 环境(比如 Docker 容器没跑 init 系统),这条路直接失效,只能退回
ps
etime 和 lstart 的兼容性、systemd 与传统进程的差异、容器环境的时间源问题,都容易让人查到一半卡住。真正上线排查时,建议先 ps --version 看下工具版本,再决定用哪条路。










