IFCE Horizonte · Portal
ADS23 · Sistemas Operacionais

Mão na massa · ~55 min

Diagnóstico de processos — e o PID duplo do container

Hoje você localiza processos de verdade com ps e top, revisita o /proc do Encontro 2 sob uma nova luz, e fecha com o reforço Docker: o mesmo processo visto de dentro e de fora de um container.

Passos 1–4 · Diagnóstico com ps/top/procPassos 5–8 · Reforço Docker: PID duplo

Passo 1 de 8

A fotografia de tudo que está rodando

ps aux lista todos os processos do sistema num instante só — a primeira ferramenta de diagnóstico do dia.
1ps aux

O que é

Lista todos os processos rodando agora, com colunas como USER, PID, %CPU, %MEM, STAT e COMMAND.

Por que importa

É o primeiro comando que qualquer profissional roda quando quer saber "o que está acontecendo" numa máquina.

$ ps aux
USER   PID  %CPU %MEM STAT  COMMAND
root     1   0.0  0.1  Ss    /sbin/init
root   842   0.2  0.4  Ss    systemd-journald
aluno 1930   0.0  0.3  Ss    bash
aluno 2044   0.0  0.1  R+    ps aux
O que esperar:

uma lista longa — dezenas de linhas, mesmo numa VM "vazia". Reparem no PID 1 (init) e no processo do próprio ps aux aparecendo na lista (STAT "R+", rodando agora).

A lista é grande demais, não sei o que procurar

Normal — ps aux mostra tudo por padrão. No próximo passo você vai filtrar.

Passo 2 de 8

Encontrando um processo específico

Em vez de ler a lista inteira, filtre pelo nome do processo que você procura.
2ps aux | grep bash

O que é

O | (pipe) encana a saída do ps aux pro grep, que filtra só as linhas contendo "bash".

Por que importa

É assim que, na prática, alguém confirma se um processo específico (um servidor, um script) está rodando ou não.

$ ps aux | grep bash
aluno 1930   0.0  0.3  Ss    bash
aluno 2051   0.0  0.0  S+    grep bash
O que esperar:

a linha do seu próprio terminal (bash) e, curiosamente, uma linha do próprio grep bash que você acabou de rodar — ele também é um processo, e apareceu procurando por si mesmo.

qual a diferença entre o que ps aux mostra e o que top (passo 4) mostra? Cite uma vantagem de cada um.

0 / 40 caracteres

Passo 3 de 8

A versão crua, direto do /proc

Lembra do Encontro 2? Todo PID também é uma pasta dentro de /proc. Vamos confirmar isso com o PID do seu próprio terminal.
3cat /proc/$$/status | head -5

O que é

$$ é uma variável especial do shell que vale o PID do próprio terminal em que você está digitando.

Por que importa

Prova que ps não é mágica — ele só lê e organiza arquivos que já existem dentro de /proc/<pid>/.

$ cat /proc/$$/status | head -5
Name:   bash
State:  S (sleeping)
Tgid:   1930
Pid:    1930
PPid:   1721
O que esperar:

o campo "Name" deve ser bash (ou o shell que você estiver usando), e o "Pid" deve bater com o número que apareceu no ps aux | grep bash do passo anterior.

O que significa "State: S (sleeping)"?

É o estado "bloqueado" do slide 5 — seu terminal está parado esperando você digitar algo (uma forma de E/S). Assim que você aperta uma tecla, ele volta pra fila de pronto e depois roda.

Passo 4 de 8

O vídeo ao vivo

Agora troque a fotografia parada por uma visão que atualiza sozinha.
4top

O que é

Mostra os processos ao vivo, atualizando a cada segundo, ordenados por quem consome mais CPU agora.

Por que importa

É a ferramenta que qualquer pessoa usa pra descobrir, em tempo real, o que está consumindo os recursos de uma máquina.

O que esperar:

uma tela cheia, atualizando sozinha. Repare na linha "load average" no topo — a fila média de processos esperando CPU nos últimos 1, 5 e 15 minutos. Aperte q pra sair.

A tela do top parece confusa

Ignore a maioria das colunas por enquanto — foque em %CPU, %MEM e COMMAND. O resto vem com a prática.

Reforço Docker · PID duplo

Passo 5 de 8

Subindo um container em segundo plano

Agora vamos criar um processo de propósito — um container rodando sleep — pra comparar como ele aparece de dentro e de fora.
5docker run -d --name meuproc alpine sleep 300

O que é

-d ("detached") sobe o container em segundo plano. sleep 300 só espera 300 segundos, sem fazer mais nada — um processo fácil de rastrear.

Por que importa

Cria um processo isolado, com nome fácil de filtrar (meuproc), pra comparar as duas visões do próximo passo.

$ docker run -d --name meuproc alpine sleep 300
8f2c91a7e6b04d3e...
O que esperar:

um código longo (o ID do container) impresso na tela, e o comando volta pro seu prompt imediatamente — o -d não prende seu terminal.

Passo 6 de 8

O processo visto de fora (no host)

O container roda como um processo comum do ponto de vista do seu Linux — vamos encontrá-lo com as mesmas ferramentas de sempre.
6ps aux | grep sleep

O que é

Filtra a lista de processos do host procurando por "sleep" — o comando que está rodando dentro do container.

Por que importa

Prova que, visto de fora, o container não é nada especial — é só mais um processo na lista do host, com um PID qualquer.

$ ps aux | grep sleep
root  48213  0.0  0.0  Ss    sleep 300
O que esperar:

um PID qualquer (nesse exemplo, 48213) — provavelmente um número alto, parecido com qualquer outro processo do host. Anote esse número, você vai compará-lo no próximo passo.

Passo 7 de 8

O mesmo processo visto de dentro (no container)

Agora entramos no próprio container e rodamos o mesmo tipo de comando lá dentro.
7docker exec meuproc ps aux

O que é

docker exec roda um comando dentro de um container que já está de pé — aqui, o próprio ps aux.

Por que importa

É o momento em que o namespace de PID aparece na prática — o "aha" da aula de hoje.

$ docker exec meuproc ps aux
PID   USER     COMMAND
  1 root     sleep 300
O que esperar:

o mesmo processo sleep 300 — só que agora com PID 1, não o número que você anotou no passo 6. É o mesmo processo, dois números diferentes, dependendo de quem está perguntando.

docker exec deu erro "container not found"

Confirme que o container ainda está rodando com docker ps. Se ele já tiver terminado (improvável em 300 segundos), repita o passo 5.

compare o PID do passo 6 (fora) com o PID do passo 7 (dentro). Por que eles são diferentes, mesmo sendo o mesmo processo?

0 / 40 caracteres

Passo 8 de 8

Encerrando e limpando

Antes de fechar, vamos parar e remover o container criado neste roteiro.
8docker stop meuproc && docker rm meuproc

O que é

docker stop encerra o container (não precisa esperar os 300 segundos). docker rm remove o registro dele.

Por que importa

Boa prática básica: não deixar containers de teste "esquecidos" rodando ou ocupando espaço.

O que esperar:

o nome meuproc impresso duas vezes (uma pra cada comando), confirmando a parada e a remoção.

livre: algo que te surpreendeu ou uma dúvida que sobrou de hoje.

0 / 40 caracteres

Exemplo de observação forte × fraca

Observação fraca

"O PID de dentro do container era diferente do PID de fora."

Observação forte

"De fora, o sleep apareceu como PID 48213 — um número comum, misturado com todos os outros processos do host. De dentro, apareceu como PID 1, porque o container tem seu próprio namespace de PID: ele conta os processos começando do zero, isolado do host."

Checklist final

  • Rodei ps aux e identifiquei pelo menos 3 colunas diferentes
  • Filtrei um processo específico com ps aux | grep
  • Comparei ps aux com cat /proc/$$/status
  • Observei o top ao vivo e identifiquei o load average
  • Subi um container e comparei o PID visto de fora e de dentro
  • Preenchi as 3 observações acima (vou colar no quiz semanal)
0 / 6 verificados