Explicação estendida ... confiando em você para absorver tudo, já que é sua lição de casa ...
Listar processos com o comando ps
$ ps
PID TTY TIME CMD
4879 pts/3 00:00:00 bash
5003 pts/3 00:00:00 ps
Oh, isso mostra apenas os processos da sessão atual. Queremos mostrar todos os processos no sistema. Para isso, podemos usar o -e
flag
$ 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]
mas como mostramos quais estão dormindo?
Você pode usar a opção -l
ou u
. Isso fornece mais detalhes, incluindo o estado do processo. Os processos de suspensão têm uma letra S
ou D
na coluna STAT
de man ps
CÓDIGOS DO ESTADO DO PROCESSO Aqui estão os valores diferentes que os especificadores de saída s, stat e state (cabeçalho "STAT" ou "S") exibirão para descrever o estado de um processo:
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
Podemos formatar a saída ps
para mostrar APENAS os estados, para facilitar a contagem:
ps -e -o state
aqui usamos -e
para obter todos os processos e o sinal -o
, seguido pelo tipo de saída que queremos. Este comando produz apenas a letra de estado. Podemos então canalizar (usando |
) essa saída para grep
para contar as linhas com S
ou D
, os processos de suspensão:
ps -e -o state | grep -cE 'S|D'
grep
procura por texto. A opção -c
diz para contar apenas correspondências em vez de gerar o próprio texto encontrado. A opção -E
informa grep
para usar a regex estendida, para que possamos usar os caracteres |
para corresponder à coisa OR usando a expressão: thing|stuff
. Ao usar o regex, use aspas simples para evitar expansões pelo shell.