![如何找到调度策略和活动进程的优先级?](https://linux22.com/image/122593/%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5%E5%92%8C%E6%B4%BB%E5%8A%A8%E8%BF%9B%E7%A8%8B%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7%EF%BC%9F.png)
我想制作一个 shell 脚本来查找所有活动进程并向用户打印调度策略。我希望结果是这样的。
pid 3042's current scheduling policy: SCHED_OTHER
pid 3042's current scheduling priority: 0
pid 3043's current scheduling policy: SCHED_OTHER
pid 3043's current scheduling priority: 0
pid 3044's current scheduling policy: SCHED_OTHER
pid 3044's current scheduling priority: 0
我已经成功做到了这一点,但仅限于使用ps
和chrt
命令的单个进程。
答案1
ps -c
没问题,但大多数实际应用程序仅更改其线程子集的调度策略。因此,它们可能部分实时运行,但只会显示为TS
.要获得完整视图,请通过添加以下内容来查看各个线程-T
:
eric ) ps -cT -p (pidof pulseaudio)
PID SPID CLS PRI TTY TIME CMD
88821 88821 TS 30 ? 00:00:25 pulseaudio
88821 88822 RR 45 ? 00:00:22 alsa-sink-ALC25
88821 88823 RR 45 ? 00:00:00 alsa-source-ALC
eric ) ps -cT -p (pidof jackdbus)
PID SPID CLS PRI TTY TIME CMD
86902 86902 TS 19 ? 00:00:00 jackdbus
86902 109091 TS 19 ? 00:00:00 jackdbus
86902 109092 FF 50 ? 00:00:00 jackdbus
86902 109093 TS 19 ? 00:00:00 jackdbus
因此,从这里您可以看到 jack 正在 FIFO 中运行,pulseaudio 正在循环运行。TS
如果-T
未指定,这两个进程都只会读取。
如果命令不起作用,切换到更好的 shell然后再试一次。
答案2
ps
我使用and提出了以下命令,awk
它给出了非常相似的输出,只有很小的区别,因为它显示了调度类的缩写名称。以下映射可以帮助您:
- TS是SCHED_OTHER
- RR是SCHED_RR
- FF是SCHED_FIFO
命令:
ps -e -o s,pid,cls,pri | grep ^R | awk -v sq="'" '{print "pid",$2,sq,"s current scheduling policy:",$3,"\npid",$2,sq,"s current priority:",$4}'
在我的主机上运行上述命令会产生以下输出:
pid 8456 ' s current scheduling policy: TS
pid 8456 ' s current priority: 19
pid 12552 ' s current scheduling policy: TS
pid 12552 ' s current priority: 19
编辑
根据注释,以下命令使用chrt
并假设活动进程是正在运行或可运行的进程给出了准确的输出R
:
ps -e -o s,pid | grep ^R | awk '{system("chrt -p " $2)}'
如果您想获取所有进程(正在运行、正在睡眠、已停止和僵尸)的输出,您需要使用以下命令:
ls /proc | grep -e ^[0-9] | awk '{system("chrt -p " $0)}'|more
答案3
我找到了两种方法来做到这一点 - 这可能不是最佳的,但它们完成了工作:
-
#! /bin/bash ps -u | grep '[0-9]' | awk '{print $2}' | while read line do chrt -p "$line" 2>/dev/null done
-
ps -u | grep '[0-9]' | awk '{system("chrt -p" $2)}' 2>/dev/null
答案4
更好的版本,基于以前的答案:
(cd /proc; ls -d [0-9]* | xargs -n 1 chrt -p)
awk
(当它显然是一项工作时不需要使用,当 shell glob 可以做时xargs
也不需要使用)grep
另外,要查看所有实时线程(避免 SCHED_OTHER 和 SCHED_IDLE),
ps -cTeFl | grep -Evw 'TS|IDL'
(虽然解析正确会需要 awk)