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 ps
und chrt
.
Antwort1
ps -c
ist 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, TS
wenn -T
nichts angegeben ist.
Wenn die Befehle nicht funktionieren,Wechseln Sie zu einer besseren Shellund versuche es erneut.
Antwort2
ps
Ich 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 chrt
davon 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:
-
#! /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
Antwort4
Bessere Versionen, basierend auf vorherigen Antworten:
(cd /proc; ls -d [0-9]* | xargs -n 1 chrt -p)
(keine Verwendung nötig, awk
wenn es sich eindeutig um einen xargs
Job handelt, auch keine Verwendung nötig, grep
wenn 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)