Comando ps (e top): investigue processos no Linux

Terminal Linux a mostrar o resultado do comando ps aux com a lista de processos do sistema

Tudo o que acontece num sistema Linux acontece dentro de um processo: o servidor web, a base de dados, a sessão SSH de um administrador — e também o minerador de criptomoedas que um atacante deixou a correr após comprometer uma aplicação. Saber listar, filtrar e interpretar processos é, por isso, uma das competências mais básicas e mais poderosas de quem administra sistemas ou trabalha em cibersegurança. As ferramentas centrais são duas e complementam-se: o ps tira uma fotografia dos processos num instante preciso; o top filma-os em contínuo.

Percorremos aqui as variantes do ps que realmente se usam, o essencial do top, e uma caça completa a um processo suspeito — para praticar no simulador interativo mais abaixo.

O que faz o ps

O ps (process status) lê a informação dos processos a partir do /proc e apresenta-a em tabela: quem é o dono, quanto CPU e memória consome, quando arrancou, em que estado está e que comando o lançou. É um instantâneo — o que aparece é o estado do sistema no momento exato em que o comando correu.

Há uma particularidade histórica importante: o ps aceita duas famílias de sintaxe. A sintaxe BSD usa opções sem hífen (ps aux); a sintaxe UNIX/System V usa hífen (ps -ef). Ambas funcionam no GNU/Linux e produzem colunas diferentes, e é útil dominar as duas:

ps [opções]           # sem opções: só os processos do seu utilizador neste terminal
ps aux                # BSD: todos os processos, formato detalhado
ps -ef                # System V: todos os processos, com a coluna PPID

Um detalhe que surpreende quem começa: sem opções, o ps mostra apenas os processos do seu utilizador associados ao terminal atual — tipicamente a shell e o próprio ps. Para ver a máquina inteira é preciso pedir.

As opções que interessam

Selecionar processos

  • aux — o clássico BSD: a mostra os processos de todos os utilizadores, u ativa o formato detalhado (com %CPU, %MEM e STAT) e x inclui os processos sem terminal — ou seja, todos os serviços.
  • -e — todos os processos, em sintaxe System V; quase sempre aparece combinado com -f (formato completo) no famoso ps -ef.
  • -u utilizador — só os processos de um utilizador concreto. Excelente para responder a «o que anda o www-data a correr?».
  • -p PID — só o processo com aquele identificador; o zoom natural depois de encontrar um suspeito.
  • -C nome — seleciona pelo nome do executável, por exemplo ps -C sshd.

Escolher colunas e ordenar

  • -o colunas — define exatamente as colunas a mostrar: pid, ppid, user, %cpu, %mem, stat, etime (há quanto tempo corre), cmd, entre muitas outras. É a opção dos scripts e dos relatórios.
  • --sort — ordena pelo campo indicado; o sinal - inverte a ordem. --sort=-%cpu põe os processos mais gulosos no topo; --sort=-rss faz o mesmo para a memória.
  • --forest — desenha a árvore pai→filho na coluna do comando, com cada processo pendurado no processo que o criou.
# Os cinco processos que mais CPU consomem, com as colunas essenciais
ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head -6

# A árvore completa de processos, com donos e PPID
ps -ef --forest

Ler a coluna STAT

No formato BSD, a coluna STAT resume o estado de cada processo: R a correr, S a dormir, D em espera de I/O ininterrompível, T parado e Z zombie — terminou, mas o pai ainda não recolheu o estado de saída. As letras adicionais afinam o retrato: s líder de sessão, l multithread, + em primeiro plano. Um serviço saudável passa a vida em S; um processo permanentemente em R com CPU alta merece um segundo olhar.

E o top?

O top mostra o mesmo universo, mas em contínuo: carga do sistema (load average), distribuição do CPU entre user space e kernel, memória, e a lista de processos atualizada a cada poucos segundos. Dentro do top, as teclas fazem o trabalho das opções: P ordena por CPU, M por memória, 1 mostra cada core individualmente e k envia um sinal a um processo. Para usar em scripts ou guardar registos há o modo batch:

top -b -n 1 > snapshot.txt   # um instantâneo completo, sem interatividade

ps e top em cibersegurança

Deteção de processos mascarados. Qualquer programa pode dar a si próprio um nome inocente — incluindo imitar kernel threads como [kworker/0:1]. Mas há uma verdade que o atacante não controla: a genealogia. Os kernel threads verdadeiros são todos filhos do kthreadd (PID 2). Um «kworker» cujo PPID aponta para uma shell, visível num ps -ef ou num ps aux --forest, é um impostor. Confirma-se com ls -l /proc/PID/exe, que revela o binário real — mesmo que já tenha sido apagado do disco.

Caça a mineradores e abuso de recursos. Um servidor comprometido para minerar criptomoedas denuncia-se pelo consumo: ps aux --sort=-%cpu ou um top mostram de imediato um processo desconhecido a ocupar quase todo o CPU. O load average persistentemente alto num servidor que devia estar folgado é muitas vezes o primeiro sintoma.

Árvore de processos em análise forense. Depois de uma intrusão, a pergunta central é «como é que isto foi lançado?». A cadeia worker do servidor web → sh -c → binário desconhecido é a assinatura clássica de execução remota de código através de uma aplicação web vulnerável: servidores web não lançam shells por iniciativa própria. O ps -ef --forest torna estas cadeias evidentes e deve ser recolhido logo no início da resposta ao incidente, antes de qualquer contenção.

Auditoria de privilégios. ps -u root responde a «o que corre como root nesta máquina?» — e cada linha dessa lista é superfície de ataque com privilégios máximos. Serviços que não precisam de root não devem lá estar; é o princípio do menor privilégio aplicado a processos.

Experimente no simulador interativo

A simulação abaixo recria uma máquina com um intruso escondido: um falso kernel thread a minerar com 97% de CPU, lançado através do servidor web. À esquerda vê todos os processos do sistema; à direita, um terminal que executa cada variante do ps (e um snapshot do top) sobre esses processos. Clique nas opções para as combinar — a lista da esquerda ilumina o que cada comando seleciona — ou use Demonstrar tudo para seguir a caça ao processo suspeito passo a passo, do primeiro ps aux até à identificação completa da cadeia de compromisso.

Erros comuns e boas práticas

  • Confundir ps aux com ps -aux. Com hífen, o ps pode tentar interpretar x como um nome de utilizador. A sintaxe BSD é sem hífen; se preferir hífen, use ps -ef.
  • Confiar no nome do processo. O nome é escolhido por quem lança o processo e é trivial de falsificar. Em caso de dúvida, valide o PPID, a árvore e o /proc/PID/exe.
  • ps | grep a apanhar o próprio grep. O velho ps aux | grep nginx devolve também a linha do próprio grep. Prefira pgrep -a nginx ou ps -C nginx, que não têm esse problema.
  • Matar antes de recolher. Num incidente, um kill -9 imediato destrói evidência valiosa. Primeiro registe: ps -ef --forest, ls -l /proc/PID/exe, ficheiros e ligações abertas. A contenção vem depois.
  • Usar o top interativo em scripts. Em automação, use top -b -n 1 ou, melhor ainda, ps -eo com as colunas exatas — a saída é estável e fácil de processar.
  • Ignorar processos zombie. Um Z ocasional é inofensivo; dezenas de zombies do mesmo pai indicam um serviço defeituoso a esgotar a tabela de processos.

Conclusão

O ps e o top são o par de olhos de quem administra sistemas: um fotografa, o outro filma, e juntos respondem às perguntas que importam — o que está a correr, quem o lançou e quanto custa. Em segurança, são frequentemente a diferença entre detetar um compromisso em minutos ou descobri-lo meses depois na fatura de eletricidade. Se quer levar estas competências mais longe, com formação prática em administração de sistemas e cibersegurança, conheça o catálogo de serviços da HJFR — e veja também o artigo sobre o useradd, onde a gestão de utilizadores encontra a gestão de processos.


Este artigo faz parte da série “Comandos Linux, um a um” do blog HJFR — fique atento aos próximos comandos.