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 ps
e chrt
.
Responder1
ps -c
está 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 TS
se -T
não forem especificados.
Se os comandos não funcionarem,mudar para um shell melhore tente novamente.
Responder2
Eu criei o seguinte comando usando ps
e awk
que 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 chrt
e 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:
-
#! /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
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 awk
quando é claramente um xargs
trabalho, também não há necessidade de usar grep
quando 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)