스케줄링 정책과 활성 프로세스의 우선순위를 찾는 방법은 무엇입니까?

스케줄링 정책과 활성 프로세스의 우선순위를 찾는 방법은 무엇입니까?

모든 활성 프로세스를 찾는 쉘 스크립트를 만들고 사용자에게 예약 정책을 인쇄하고 싶습니다. 결과는 다음과 같습니다.

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

ps나는 이 작업을 수행했지만 및 명령을 사용하는 단일 프로세스에 대해서만 수행했습니다 chrt.

답변1

ps -c괜찮습니다. 그러나 대부분의 실제 애플리케이션은 스레드 하위 집합의 예약 정책만 변경합니다. 따라서 부분적으로 실시간으로 실행될 수도 있지만 TS. 전체 보기를 보려면 다음을 추가하여 개별 스레드를 살펴보세요 -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

여기에서 jack이 FIFO로 실행되고 pulseaudio가 라운드 로빈으로 실행되는 것을 볼 수 있습니다. 지정되지 않은 TS경우 두 프로세스 모두 읽기만 합니다 .-T

명령이 작동하지 않는 경우,더 나은 쉘로 전환그리고 다시 시도해 보세요.

답변2

나는 예약 클래스의 약식 이름을 표시한다는 점에서 약간의 차이만 있고 매우 유사한 출력을 제공하는 다음 명령 ps을 생각해냈습니다 . awk다음 매핑이 도움이 될 수 있습니다.

  • TS~이다SCHED_OTHER
  • ₩₩~이다SCHED_RR
  • FF~이다SCHED_FIFO

명령:

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

내 호스트에서 위 명령을 실행하면 다음과 같은 출력이 제공됩니다.

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

편집하다

주석을 기반으로 다음 명령은 chrt활성 프로세스가 실행 중이거나 실행 가능한 프로세스라고 가정하고 정확한 출력을 제공합니다 R.

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

모든 프로세스(실행 중, 절전 중, 중지 및 좀비)에 대한 출력을 얻으려면 다음 명령을 사용하고 싶습니다.

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

답변3

나는 이를 수행하는 두 가지 방법을 찾았습니다. 이는 최적이 아닐 수도 있지만 작업을 완료합니다.

  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
    

답변4

이전 답변을 기반으로 한 더 나은 버전:

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

awk( 분명히 작업인 경우에는 사용할 필요가 없으며 쉘 글로브를 사용하는 경우에도 xargs사용할 필요가 없습니다 )grep

또한 모든 실시간 스레드를 보려면(SCHED_OTHER 및 SCHED_IDLE 제외)

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

(제대로 구문 분석했지만~일 것이다awk가 필요함)

관련 정보