如何找到调度策略和活动进程的优先级?

如何找到调度策略和活动进程的优先级?

我想制作一个 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

我已经成功做到了这一点,但仅限于使用pschrt命令的单个进程。

答案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它给出了非常相似的输出,只有很小的区别,因为它显示了调度类的缩写名称。以下映射可以帮助您:

  • TSSCHED_OTHER
  • RRSCHED_RR
  • FFSCHED_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

我找到了两种方法来做到这一点 - 这可能不是最佳的,但它们完成了工作:

  1. #! /bin/bash 
    ps -u | grep '[0-9]' | awk '{print $2}' |
        while read line 
        do
            chrt -p "$line" 2>/dev/null
        done
    
  2. 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)

相关内容