Quiero crear un script de shell que encuentre todos los procesos activos e imprimirle al usuario la política de programación. Quiero que el resultado sea así.
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
He logrado hacer esto pero solo para un único proceso con el uso de comandos ps
y chrt
.
Respuesta1
ps -c
está bien, pero la mayoría de las aplicaciones reales sólo cambian la política de programación de un subconjunto de sus subprocesos. Por lo tanto, es posible que se estén ejecutando parcialmente en tiempo real, pero solo aparecerán como TS
. Para obtener una vista completa, mire los hilos individuales agregando -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
Entonces, desde aquí puede ver que jack se está ejecutando en FIFO y pulseaudio se está ejecutando en round robin. Ambos procesos simplemente leen TS
si -T
no se especifica.
Si los comandos no funcionan,cambiar a un mejor caparazóne intenta de nuevo.
Respuesta2
Se me ocurrió el siguiente comando usando ps
y awk
que proporciona un resultado muy similar con solo una pequeña diferencia en que muestra nombres abreviados de la clase de programación. El siguiente mapeo podría ayudarte:
- TSesSCHED_OTHER
- RResSCHED_RR
- FFesSCHED_FIFO
El comando:
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}'
Al ejecutar el comando anterior en mi host se obtiene el siguiente resultado:
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
EDITAR
Según el comentario, el siguiente comando proporciona un resultado exacto usando chrt
y asumiendo que un proceso activo es un proceso en ejecución o ejecutable R
:
ps -e -o s,pid | grep ^R | awk '{system("chrt -p " $2)}'
En caso de que desee obtener el resultado de todos los procesos (en ejecución, inactivo, detenido y zombi), le gustaría utilizar el siguiente comando:
ls /proc | grep -e ^[0-9] | awk '{system("chrt -p " $0)}'|more
Respuesta3
Encontré dos formas de hacerlo, que pueden no ser óptimas, pero hacen el trabajo:
-
#! /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
Respuesta4
Mejores versiones, basadas en respuestas anteriores:
(cd /proc; ls -d [0-9]* | xargs -n 1 chrt -p)
(no es necesario usarlo awk
cuando es claramente un xargs
trabajo, tampoco es necesario usarlo grep
cuando los globos de shell serían suficientes)
Además, para ver todos los hilos en tiempo real (evitando SCHED_OTHER y SCHED_IDLE),
ps -cTeFl | grep -Evw 'TS|IDL'
(aunque analizando correctamenteharíarequiere awk)