Я хочу создать скрипт оболочки, который находит все активные процессы и выводит пользователю политику планирования. Я хочу, чтобы результат был таким.
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
Я нашел два способа сделать это — возможно, они не оптимальны, но свою задачу выполняют:
-
#! /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
решение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)