如何找到調度策略和活動流程的優先順序?

如何找到調度策略和活動流程的優先順序?

我想製作一個 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)

相關內容