ps -al 输出中第8列是pri、第9列是ni;pri=80+ni,范围60~99,ni取值-20~19,普通用户只能调高ni(降低优先级),root才能调低ni(提升优先级)。

ps -al 输出里怎么看 PRI 和 NI
直接运行 ps -al,输出中第 8 列是 PRI,第 9 列是 NI(即 nice 值)。注意:ps -l 只显示当前 shell 及其直系子进程,往往看不到你刚启动的后台程序;必须用 ps -al 才能查全所有用户进程。
PRI 是内核调度时实际使用的优先级数值,Linux 默认基准值为 80;NI 是用户可调的修正值,范围固定在 -20 到 19。真实调度优先级 = 80 + NI,所以最终 PRI 落在 60~99 区间。
- 看到
PRI是 85、NI是 5 → 说明它被调低了优先级(更晚执行) -
PRI是 70、NI是 -10 → 是主动提权,但普通用户无法设负值,除非你是 root 或用了sudo - 如果
NI显示为-(短横),通常表示该进程是内核线程或实时进程,不走 nice 调度路径
top 里动态看优先级更直观
运行 top 后,默认列不显示 NI,按 f 进入字段管理,用方向键选中 NI 和 PRI,空格启用,再按 q 退出配置。这时你能实时看到每个进程的这两个值滚动更新。
注意:top 默认显示的 “PR” 列其实是计算后的 PRI(即 80 + NI),不是原始 PRI 基准值;而 “NI” 列就是你可改的那个 nice 值。
- 普通用户启动的进程,
NI初始为 0,PR显示为 80 - 如果你用
nice -n 5 ./myapp启动,NI就是 5,PR就是 85 -
top里按r修改的是NI,不是直接输PR—— 输错会提示 “invalid nice value”
为什么 ps 和 top 显示的 PRI 数值有时不一致
根本原因是:不同命令读取 task_struct 的方式和时机不同。ps 是快照式扫描,top 是持续轮询;更重要的是,ps 的 PRI 列显示的是内核当前计算出的调度优先级(即 80 + NI),而部分旧版文档或误读会以为它是“原始 PRI”。实际上 Linux 内核早已不暴露所谓“原始 PRI”,所有用户空间看到的 PRI 都是最终值。
- 同一进程在
ps -al和top里PRI不同?大概率是刷新延迟或你中途改过NI,不是 bug - 如果发现
ps里PRI是 99,但NI是 19 → 正常,80 + 19 = 99 - 若
NI是 -20 但PRI不是 60 → 检查是否真生效了(比如没用sudo,修改被忽略)
普通用户能改哪些进程的优先级
只能改自己启动的、且状态为 R(运行中)或 S(睡眠中)的进程;不能改系统关键进程(如 systemd、kthreadd),也不能改其他用户的进程。
- 用
ps -u $USER先确认目标 PID 归属自己 - 尝试
top→r→ 输入 PID → 输入新NI,若提示 “permission denied”,说明权限不足或目标进程不可调 - 想设
NI = -10?必须加sudo top,否则会被拒绝 —— 这不是 bug,是内核强制保护 - 已退出或僵尸(
Z)状态的进程,NI不再有意义,修改无效
D(不可中断睡眠)状态,再高的优先级也唤不醒它——它正在等磁盘或硬件完成操作。











