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

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

모든 활성 프로세스를 찾아 사용자에게 일정 정책을 인쇄하는 쉘 스크립트를 만들고 싶습니다. 이것이 결과이기를 바랍니다.

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

나는 이 작업을 성공적으로 수행했지만 psand 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

따라서 여기에서 잭이 FIFO에서 실행되고 펄스오디오가 루프에서 실행되는 것을 볼 수 있습니다. 지정하지 TS않으면 -T두 프로세스 모두 읽기만 합니다.

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

답변2

psand를 사용하여 다음 명령을 생각해 냈는데 awk스케줄링 클래스의 약식 이름을 표시하므로 약간의 차이만 있고 매우 유사한 출력을 제공합니다. 다음 매핑이 도움이 될 수 있습니다.

  • TSSCHED_OTHER
  • ₩₩SCHED_RR
  • FFSCHED_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)

awkxargs(분명히 작업일 때나 Shell glob이 할 수 있는 경우에는 사용할 필요가 없습니다 )grep

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

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

(파싱이 정확하더라도회의awk 필요)

관련 정보