Como encontrar a política de agendamento e a prioridade dos processos ativos?

Como encontrar a política de agendamento e a prioridade dos processos ativos?

Quero fazer um shell script que encontre todos os processos ativos e imprima para o usuário a política de agendamento.

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

Consegui fazer isso, mas apenas para um único processo com o uso de comandos pse chrt.

Responder1

ps -cestá OK, mas a maioria dos aplicativos reais altera apenas a política de agendamento de um subconjunto de seus threads. Portanto, eles podem estar sendo executados parcialmente em tempo real, mas aparecerão apenas como arquivos TS. Para uma visão completa, observe os tópicos individuais adicionando -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

Então, a partir daqui você pode ver que o jack está rodando em FIFO e o pulseaudio está rodando em round robin. Ambos os processos apenas são lidos TSse -Tnão forem especificados.

Se os comandos não funcionarem,mudar para um shell melhore tente novamente.

Responder2

Eu criei o seguinte comando usando pse awkque fornece uma saída muito semelhante, com apenas uma pequena diferença, pois mostra nomes abreviados da classe de agendamento. O mapeamento a seguir pode ajudá-lo:

  • TSéSCHED_OTHER
  • RRéSCHED_RR
  • FFéSCHED_FIFO

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

Executar o comando acima em meu host fornece a seguinte saída:

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

Com base no comentário, o comando a seguir fornece uma saída exata usando chrte assumindo que um processo ativo é um processo em execução ou executável R:

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

Caso queira obter a saída de todos os processos (Running, Sleeping, Stopped & Zombie), você gostaria de usar o seguinte comando:

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

Responder3

Encontrei duas maneiras de fazer isso - que podem não ser as ideais, mas dão conta do recado:

  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
    

Responder4

Versões melhores, com base em respostas anteriores:

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

(não há necessidade de usar awkquando é claramente um xargstrabalho, também não há necessidade de usar grepquando shell globs serviriam)

Além disso, para ver todos os threads em tempo real (evitando SCHED_OTHER e SCHED_IDLE),

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

(embora analisando corretamenteseriarequer awk)

informação relacionada