アクティブプロセスのスケジューリングポリシーと優先順位を見つけるには?

アクティブプロセスのスケジューリングポリシーと優先順位を見つけるには?

すべてのアクティブなプロセスを見つけて、ユーザーにスケジュールポリシーを印刷するシェルスクリプトを作成したいと思います。これが結果であることを願っています。

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

私はこれをうまく実行しましたが、psandchrtコマンドを使用する単一のプロセスにのみ適用されます。

答え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

psand を使用して次のコマンドを考えましたが、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つの方法を見つけました。これは最適ではないかもしれませんが、作業を完了します。

  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)

awkxargs(明らかに作業中やShell globができる場合には使用する必要はありません)grep

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

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

(解析が正確であっても会議awkが必要)

関連情報