Как подсчитать количество спящих процессов, используя скрипт оболочки?
Расширенное объяснение... доверяя Вам для принятия всего этого, так как это - домашняя работа...
Список обрабатывает с ps
команда
$ ps
PID TTY TIME CMD
4879 pts/3 00:00:00 bash
5003 pts/3 00:00:00 ps
О, это только показывает процессы текущей сессии. Мы хотим показать все процессы в системе. Для этого мы можем использовать -e
флаг
$ ps -e
PID TTY TIME CMD
1 ? 00:00:05 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
[and many more lines]
но как мы показываем, которые спят??
Можно использовать -l
опция или u
опция. Это предоставляет больше подробной информации включая состояние процесса. Ждущие процессы имеют букву S
или D
в столбце STAT
от man ps
ОБРАБОТАЙТЕ КОДЫ СОСТОЯНИЯ, Вот различные значения, что s, статистика и указывают, что выходные спецификаторы (заголовок "СТАТИСТИКА" или "S") отобразятся для описания состояния процесса:
D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped by job control signal t stopped by debugger during the tracing W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct ("zombie") process, terminated but not reaped by its parent
Мы можем отформатировать ps
вывод, чтобы показать ТОЛЬКО состояния, помочь считать их:
ps -e -o state
здесь мы используем -e
получить все процессы и -o
флаг, сопровождаемый типом вывода, мы хотим. Эта команда выводы только буква состояния. Мы можем затем передать по каналу (использование |
) этот вывод к grep
считать строки с S
или D
, ждущие процессы:
ps -e -o state | grep -cE 'S|D'
grep
поиски текста. -c
опция говорит этому только считать соответствия вместо того, чтобы произвести сам найденный текст. -E
опция говорит grep
использовать расширенный regex, так, чтобы мы могли использовать |
символы для соответствия вещи ИЛИ материалу с помощью выражения: thing|stuff
. При использовании regex, используйте одинарные кавычки для предотвращения расширений оболочкой.
Очень легкий, если Вы знаете, что ps
выходное состояние команды для ждущих процессов как любой S
для прерываемого сна и D
для бесперебойного сна, и можно использовать -o s
флаг для нахождения состояния тех. Теперь все, что необходимо сделать, должно выполнить вывод до grep
, который будет считать случаи тех флагов. Как так:
$ ps -e -o s | grep -o 'S\|D' -c
260
top
утилита обеспечивает количество задач, показывая, сколько работает, и сколько спит. Конечно, это изменяется на мгновение за мгновением основание, но так было бы вывод любой из этих острот. Как с любым *отклоняют утилиту, man
, страница предоставит большую подробную информацию.
Иначе должен перечислить количество процессов в каждом состоянии при помощи:
$ ps -e -o state | sort | uniq -c
1 R
141 S