すべてのアクティブなプロセスを見つけて、ユーザーにスケジュールポリシーを印刷するシェルスクリプトを作成したいと思います。これが結果であることを願っています。
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
andchrt
コマンドを使用する単一のプロセスにのみ適用されます。
答え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
したがって、ここではジャックがFIFOで実行され、パルスオーディオがループで実行されていることがわかります。指定しない場合、両方のTS
プロセス-T
は読み取りのみを行います。
コマンドが機能しない場合、より良いシェルに切り替えるそれからもう一度やり直してください。
答え2
ps
and を使用して次のコマンドを考えましたが、awk
スケジューリングクラスの省略名を表示するので、わずかな違いがあり、非常に似た出力を提供します。次のマッピングが役に立ちます。
- TSはいSCHED_OTHER
- ¥¥はい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
私はこれを行う2つの方法を見つけました。これは最適ではないかもしれませんが、作業を完了します。
-
#! /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
xargs
(明らかに作業中やShell globができる場合には使用する必要はありません)grep
また、すべてのリアルタイムスレッドを表示するには(SCHED_OTHERとSCHED_IDLEを除く)
ps -cTeFl | grep -Evw 'TS|IDL'
(解析が正確であっても会議awkが必要)