スケジューリング ポリシーとアクティブ プロセスの優先度を見つけるにはどうすればよいでしょうか?

スケジューリング ポリシーとアクティブ プロセスの優先度を見つけるにはどうすればよいでしょうか?

すべてのアクティブなプロセスを検索し、スケジューリング ポリシーをユーザーに出力するシェル スクリプトを作成したいと思います。結果は次のようになります。

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 つの方法を見つけました。最適ではないかもしれませんが、目的は達成できます。

  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(明らかにジョブである場合は使用する必要はありません。また、シェル グロブで十分な場合もxargs使用する必要はありません)grep

また、すべてのリアルタイムスレッドを表示するには(SCHED_OTHERとSCHED_IDLEを回避)、

ps -cTeFl | grep -Evw 'TS|IDL'

(ただし、適切に解析するとだろうawkが必要)

関連情報