すべてのアクティブなプロセスを検索し、スケジューリング ポリシーをユーザーに出力するシェル スクリプトを作成したいと思います。結果は次のようになります。
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
コマンドが機能しない場合は、より良いシェルに切り替えるそしてさらに試みる。
答え2
ps
とを使用して次のコマンドを作成しました。awk
これは、スケジューリング クラスの省略名を表示するというわずかな違いを除いて、非常によく似た出力を生成します。次のマッピングが役立つかもしれません。
- TSはスケジュール_その他
- RRはスケジュール
- FFはスケジューリング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
使用する必要はありません)grep
また、すべてのリアルタイムスレッドを表示するには(SCHED_OTHERとSCHED_IDLEを回避)、
ps -cTeFl | grep -Evw 'TS|IDL'
(ただし、適切に解析するとだろうawkが必要)