Wie finde ich die Planungsrichtlinie und die Priorität aktiver Prozesse?

Wie finde ich die Planungsrichtlinie und die Priorität aktiver Prozesse?

Ich möchte ein Shell-Skript erstellen, das alle aktiven Prozesse findet und dem Benutzer die Planungsrichtlinie ausgibt. Das Ergebnis soll so aussehen.

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

Mir ist dies gelungen, allerdings nur für einen einzelnen Prozess mithilfe der Befehle psund chrt.

Antwort1

ps -cist OK, aber die meisten echten Anwendungen ändern nur die Planungsrichtlinie einer Teilmenge ihrer Threads. Sie laufen also teilweise in Echtzeit, werden aber nur als angezeigt TS. Für eine vollständige Ansicht sehen Sie sich die einzelnen Threads an, indem Sie ein hinzufügen -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

Von hier aus können Sie sehen, dass Jack im FIFO-Modus und Pulseaudio im Round Robin-Modus ausgeführt wird. Beide Prozesse lesen nur, TSwenn -Tnichts angegeben ist.

Wenn die Befehle nicht funktionieren,Wechseln Sie zu einer besseren Shellund versuche es erneut.

Antwort2

psIch habe den folgenden Befehl mit und erstellt awk, der eine sehr ähnliche Ausgabe liefert, mit dem einzigen kleinen Unterschied, dass er abgekürzte Namen der Planungsklasse anzeigt. Die folgende Zuordnung könnte Ihnen helfen:

  • TSIstSCHED_OTHER
  • RRIstSCHED_RR
  • FFIstSCHED_FIFO

Der Befehl:

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}'

Wenn ich den obigen Befehl auf meinem Host ausführe, erhalte ich die folgende Ausgabe:

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

BEARBEITEN

Basierend auf dem Kommentar gibt der folgende Befehl eine genaue Ausgabe aus, wobei chrtdavon ausgegangen wird, dass es sich bei einem aktiven Prozess um einen laufenden oder ausführbaren Prozess handelt R:

ps -e -o s,pid | grep ^R | awk '{system("chrt -p " $2)}'

Wenn Sie die Ausgabe für alle Prozesse (Ausführen, Ruhen, Angehalten und Zombie) erhalten möchten, verwenden Sie den folgenden Befehl:

ls /proc | grep -e ^[0-9] | awk '{system("chrt -p " $0)}'|more

Antwort3

Ich habe zwei Möglichkeiten gefunden, dies zu tun – die vielleicht nicht optimal sind, aber ihren Zweck erfüllen:

  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
    

Antwort4

Bessere Versionen, basierend auf vorherigen Antworten:

(cd /proc; ls -d [0-9]* | xargs -n 1 chrt -p)

(keine Verwendung nötig, awkwenn es sich eindeutig um einen xargsJob handelt, auch keine Verwendung nötig, grepwenn Shell-Globs ausreichen würden)

Um außerdem alle Echtzeit-Threads anzuzeigen (unter Vermeidung von SCHED_OTHER und SCHED_IDLE),

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

(obwohl richtig analysiertwürdeerfordert awk)

verwandte Informationen