You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux系统如何区分进程RUNNING运行态与RUNNABLE就绪态?

你在/proc/[pid]/status中看到的R状态确实默认合并了**RUNNING(正在CPU上运行)和RUNNABLE(就绪态等待调度)**两种场景,但是可以通过内核默认提供的/proc接口、系统工具明确区分这两种状态,常见方法如下:

方法1:通过ps命令直接查询(兼容性最好)

ps命令已经封装了/proc/[pid]/stat中的等待通道(wchan)字段,直接执行以下命令即可:

# 替换<pid>为目标进程ID
ps -o pid,stat,wchan:20,comm <pid>

输出判断规则:

  • 如果WCHAN列显示为running:进程当前正在CPU上执行
  • 如果WCHAN列显示为调度相关内核函数(如schedule):进程处于运行队列中等待CPU调度

示例输出(正在运行的redis进程):

PID STAT WCHAN                COMMAND
 8976 R    running              redis-server

方法2:读取/proc/sched_debug调度状态(直观易读)

/proc/sched_debug是内核调度器暴露的状态文件,会按CPU分组输出调度信息:

  • 每个CPU下的CURRENT行标注的是当前正在该CPU上运行的进程
  • 下方RUNNABLE列表中列出的是处于就绪态、等待调度的进程

直接grep目标pid即可快速判断:

grep -A2 -B10 '<pid>' /proc/sched_debug

注:该方法需要内核开启CONFIG_SCHED_DEBUG编译选项,绝大多数桌面/服务器发行版默认已开启。

方法3:读取/proc/[pid]/schedstat统计运行队列延迟

如果你还需要统计进程的运行队列等待总时长,可以读取/proc/[pid]/schedstat文件,该文件共有3个字段,单位均为纳秒:

cat /proc/[pid]/schedstat
# 输出格式:<累计运行时间> <累计运行队列等待时间> <时间片切片次数>

第二个字段就是进程从启动到现在,在运行队列中等待CPU的总时长,你可以通过该值判断进程的调度延迟是否符合预期。

方法4:perf工具精准观测

如果需要瞬时精准判断进程调度状态,也可以使用内核原生的perf工具:

# 采样100ms内的进程调度事件
perf record -e sched:sched_switch -p <pid> sleep 0.1 && perf script

如果输出显示进程最近的事件是被调度上CPU、没有后续切换出CPU的记录,说明进程处于正在运行状态。

内容的提问来源于stack exchange,提问作者user2512324

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 09:15:03