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