ps 查进程启动时间应使用 lstart 字段,格式为“mon mar 18 10:22:34 2024”,精确到秒且含年份;运行时长优先用 etime(单位秒),可配合 awk 转换为“xh ym”格式;alpine 等系统若用 busybox ps 则不支持这些字段。

ps 命令怎么看进程启动时间(精确到秒)
Linux 默认的 ps 输出不直接显示“启动时间”,但可通过 lstart 字段获取完整启动时间戳。关键不是记选项,而是知道该用哪个字段:lstart 是最可靠的选择,它输出类似 Mon Mar 18 10:22:34 2024 的格式,包含年份,不会因跨年歧义。
常用写法:
ps -eo pid,lstart,cmd --sort=-lstart | head -5
注意:--sort=-lstart 表示按启动时间倒序(最新在前),-e 查所有进程,-o 自定义输出字段。别用 stime——它只返回从系统启动起的秒数,没上下文根本没法换算成真实时间。
ps 怎么算进程已运行多少小时/天(避免手动计算)
想直接看到“运行了多久”,优先用 etime(elapsed time),单位是秒,表示从进程启动到现在的总秒数。它比看 lstart 后自己减时间靠谱得多,尤其跨时区或夏令时场景下不会出错。
实操建议:
-
etime是浮点数,含小数位(精度到毫秒级),但通常取整足够:用awk '{print int($2/3600) "h " int(($2%3600)/60) "m"}'快速转成“Xh Ym”格式 - 不要依赖
time字段——它只显示 CPU 占用的总时间(非运行时长),且单位是MM:SS格式,容易误解 - 对长期运行的服务(如
nginx、java),加grep -v "defunct"排除僵尸进程干扰
为什么 ps -eo pid,etime,cmd 有时显示 etime 为 0?
这不一定是命令写错,而是内核限制:当进程 UID 不属于当前用户,且未以 root 运行 ps 时,非特权用户看不到其他用户的 etime 精确值,会强制返回 0。这是 Linux 的安全策略(/proc/PID/stat 中的 start_time 字段受权限控制)。
验证方法:
- 用
sudo ps -eo pid,euid,etime,cmd | grep $YOUR_PID对比有无sudo时的etime值 - 普通用户查自己启动的进程(如 shell 子进程)通常没问题;查
systemd或mysql等系统服务时,etime多数为 0 - 替代方案:若必须估算,可用
lstart和date +%s手动相减,但需确保时区一致(date和ps都用本地时区)
ps 查启动时间时容易忽略的兼容性陷阱
不同发行版的 ps 实现可能不一致:CentOS/RHEL 用 GNU procps-ng,Ubuntu/Debian 也基本一致,但 Alpine Linux 默认用 busybox ps,根本不支持 lstart 或 etime 字段——直接报错 unknown sort key 或字段为空。
判断和绕过方法:
- 先运行
ps --version,输出含procps-ng才支持高级字段;若输出busybox,得换方案 - Alpine 下临时装完整版:
apk add procps,再用/usr/bin/ps - 容器环境里更常见此问题——基础镜像精简过度,
lstart看似语法对,实际无输出,别硬调
真正麻烦的不是记不住字段,而是默认假设所有 Linux 都一样。跨环境部署脚本前,务必在目标系统上实测 ps -eo pid,lstart 2>/dev/null | head -1 是否有输出。










