ps 命令不直接输出“运行状态”字段,但通过 ps aux 可读取第九列 STAT(如 R/S/Z/T/I)判断进程实时状态,第二列 PID 用于标识进程,结合 grep 或 pgrep 筛选并提取关键信息。

ps 命令本身不直接输出“运行状态”字段,但结合 grep 筛选后,能快速定位目标进程,并从输出中读取关键信息:第二列是 PID,第十一列(COMMAND)隐含启动方式,而第三列(%CPU)、第四列(%MEM)、第九列(STAT)共同反映实时运行状态(如 R 表示运行中、S 表示休眠、Z 表示僵尸)。
用 ps aux | grep 提取 PID 并识别基本状态
ps aux 输出包含用户、PID、CPU/内存占用、TTY、STAT、START、TIME 和 COMMAND。grep 用来过滤关键词,但要注意避免把 grep 自身进程混入结果:
- 基础写法:
ps aux | grep nginx—— 能看到所有含 “nginx” 的行,包括主进程和 worker,但最后一行通常是grep nginx,需手动忽略 - 更干净的写法:
ps aux | grep '[n]ginx'或ps aux | grep nginx | grep -v grep—— 前者利用方括号使 grep 不匹配自身,后者显式排除含 “grep” 的行 - PID 总在第二列,可用 awk 提取:
ps aux | grep '[p]ython3' | awk '{print $2}'—— 输出第一个匹配进程的 PID
从 STAT 字段判断进程当前运行状态
STAT 列是一个或多个字母组合,常见含义如下(出现在 ps aux 第九列):
- R:正在运行或可运行(在 CPU 队列中)
- S:休眠(等待某事件,如 I/O 完成)
- Z:僵尸进程(已终止但父进程未回收)
- T:被停止(如收到 SIGSTOP 或调试暂停)
- I:空闲(内核线程,Linux 3.15+ 引入)
例如执行 ps aux | grep '[s]shd',若某行 STAT 是 S,说明该 sshd 进程正等待连接;若是 R,说明它当前正处理请求。
用 pgrep 替代 grep 获取更精准的 PID 和状态线索
pgrep 是专为查 PID 设计的命令,比 grep 更可靠:
-
pgrep -x sshd—— 精确匹配进程名(不匹配 sshd_config 或 ssh-agent) -
pgrep -l -x nginx—— 同时输出 PID 和进程名,便于确认是否为目标主进程 -
pgrep -f "python3.*myapp.py"—— 用 -f 匹配完整命令行,适合带参数的脚本 - 拿到 PID 后,可用
ps -o pid,stat,comm -p PID单独查看该进程的状态字段和命令名,避免冗余信息
补充:验证进程是否存在且活跃的实用组合
单靠一行命令判断“是否在跑”,建议用简洁逻辑:
- 检查 PID 是否存在:
kill -0 $(pgrep -x nginx 2>/dev/null) && echo "running" || echo "not found"—— kill -0 不发送信号,只检测进程是否存在 - 查看最近 CPU 活动:
ps -o pid,%cpu,stat,comm -C nginx | awk '$2 > 0.1 {print "active"}'—— 若 %CPU 明显大于 0,说明正在工作 - 结合 /proc 查状态:
cat /proc/$(pgrep -x nginx)/stat 2>/dev/null | awk '{print $3}'—— 输出第三字段(即 STAT),直接获取原始状态码


















