Как определить политику планирования и приоритет активных процессов?

Как определить политику планирования и приоритет активных процессов?

Я хочу создать скрипт оболочки, который находит все активные процессы и выводит пользователю политику планирования. Я хочу, чтобы результат был таким.

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 работает в режиме round robin. Оба этих процесса просто считывают, TSесли -Tне указано.

Если команды не работают,перейти на лучшую оболочкуи попробуй еще раз.

решение2

Я придумал следующую команду, используя psи awkкоторая дает очень похожий вывод с небольшой разницей в том, что она показывает сокращенные имена класса планирования. Следующее сопоставление может вам помочь:

  • ТСявляетсяSCHED_OTHER
  • РРявляетсяSCHED_RR
  • ФФявляется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)

Связанный контент