¿Cómo encontrar la política de programación y la prioridad de los procesos activos?

¿Cómo encontrar la política de programación y la prioridad de los procesos activos?

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 psy chrt.

Respuesta1

ps -cestá 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 TSsi -Tno se especifica.

Si los comandos no funcionan,cambiar a un mejor caparazóne intenta de nuevo.

Respuesta2

Se me ocurrió el siguiente comando usando psy awkque 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 chrty 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:

  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
    

Respuesta4

Mejores versiones, basadas en respuestas anteriores:

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

(no es necesario usarlo awkcuando es claramente un xargstrabajo, tampoco es necesario usarlo grepcuando 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)

información relacionada