Processos são programas em execução no sistema. Cada comando que você digita no terminal, cada serviço do sistema, cada aplicativo gráfico é um processo. Entender como listar, monitorar e interpretar informações sobre processos é fundamental para administrar um sistema Linux, diagnosticar problemas e otimizar o desempenho.

Nesta aula, vamos explorar os comandos ps e pstree, além de compreender os conceitos de PID (Process ID) e PPID (Parent Process ID) e os estados que um processo pode assumir. Você verá exemplos práticos e aprenderá a extrair informações valiosas do sistema.

ps

O comando ps (process status) é uma das ferramentas mais utilizadas para visualizar informações sobre processos ativos no sistema. Ele exibe uma fotografia instantânea dos processos em um determinado momento. Existem várias opções que controlam quais processos são mostrados e quais informações são exibidas.

A sintaxe básica é ps [opções]. Sem opções, o ps mostra apenas os processos associados ao terminal atual. Para ver todos os processos do sistema, usamos opções como -e (ou -A) para listar todos, e -f para exibir informações completas (formato longo). Combinando opções, podemos obter uma visão detalhada.

Exemplos comuns:

# Lista todos os processos do sistema com formato longo
ps -ef

# Lista todos os processos com informações de usuário e CPU/memória
ps aux

# Filtra por nome do processo
ps -C bash

# Mostra a árvore de processos (semelhante ao pstree, mas com ps)
ps -ejH

A saída do ps aux inclui colunas como USER (dono do processo), PID, %CPU, %MEM, VSZ (tamanho virtual), RSS (memória residente), TTY (terminal), STAT (estado), START (hora de início) e COMMAND (comando executado). Essas informações são essenciais para monitorar o consumo de recursos.

pstree

O comando pstree exibe os processos em forma de árvore, mostrando a hierarquia de parentesco entre eles. Cada processo é representado por um nó, e os processos filhos são exibidos abaixo de seus pais. Essa visualização é útil para entender a relação entre processos e identificar processos órfãos ou zumbis.

Por padrão, o pstree mostra todos os processos do sistema, mas você pode especificar um PID para ver a árvore a partir daquele processo. Opções comuns incluem -p para mostrar os PIDs e -u para mostrar mudanças de usuário.

# Exibe a árvore de processos com PIDs
pstree -p

# Exibe a árvore a partir do PID 1 (systemd)
pstree -p 1

# Exibe a árvore com destaque para processos do usuário atual
pstree -u

O pstree é particularmente útil para visualizar como os processos são organizados e como o sistema inicial (geralmente o systemd) é o pai de todos os processos.

PID e PPID

Todo processo no Linux recebe um identificador único chamado PID (Process ID). Esse número é atribuído pelo sistema e é usado para controlar o processo. O PID 1 é o primeiro processo iniciado pelo kernel (normalmente o systemd ou init), e todos os outros processos são descendentes dele.

Além do PID, cada processo tem um PPID (Parent Process ID), que é o PID do processo que o criou. Quando um processo é criado, ele herda o PPID de seu pai. O PPID é importante para rastrear a origem de um processo e para entender a hierarquia.

Você pode descobrir o PID e PPID de um processo usando o comando ps com as opções -o para especificar os campos desejados. Por exemplo:

# Mostra PID, PPID e comando
ps -o pid,ppid,comm

# Mostra PID, PPID e comando de um processo específico
ps -o pid,ppid,comm -C bash

No shell, você pode obter o PID do shell atual com echo $$ e o PPID com echo $PPID. Isso é útil em scripts para saber o contexto de execução.

echo "PID do shell: $$"
echo "PPID do shell: $PPID"

Estados de processo

Um processo pode estar em diferentes estados durante seu ciclo de vida. O Linux define vários estados, que são exibidos na coluna STAT do comando ps. Os principais são:

  • R (Running): o processo está em execução ou pronto para executar na CPU.
  • S (Sleeping): o processo está dormindo, aguardando algum evento (como entrada/saída).
  • D (Uninterruptible Sleep): o processo está em espera não interrompível, geralmente aguardando operações de I/O com disco.
  • T (Stopped): o processo foi pausado, por exemplo, via Ctrl+Z.
  • Z (Zombie): o processo já terminou, mas ainda está na tabela de processos aguardando que o pai colete seu status.
  • I (Idle): processo inativo, usado em threads do kernel.

Esses estados podem ser combinados com caracteres adicionais, como s (session leader), l (multithreaded), etc. Entender o estado de um processo ajuda a diagnosticar problemas, como processos travados ou zumbis.

Exemplo de como ver os estados:

# Mostra processos com estado
ps -o pid,state,comm

Para ver todos os processos com seus estados, use ps aux e observe a coluna STAT.

Boas práticas e observações finais

Ao trabalhar com processos, é importante:

  • Use ps para obter uma visão instantânea, mas para monitoramento contínuo, considere o top ou htop.
  • Identifique processos zumbis e evite acumulá-los; eles podem indicar problemas no processo pai.
  • Combine ps com grep para filtrar rapidamente por nome ou outros critérios.
  • Para matar um processo, use kill com o PID, mas primeiro entenda o que o processo faz.
  • Em scripts, use $$ e $PPID para identificar o script e seu pai, útil para logging.

Exercícios

  1. Qual comando você usaria para listar todos os processos do sistema com informações detalhadas? Escreva o comando e explique o que cada coluna principal representa.
  2. Como você faria para visualizar a árvore de processos a partir do processo de PID 1? Que comando e opções usaria?
  3. Explique a diferença entre PID e PPID. Como você pode descobrir o PID e PPID de um processo específico usando o comando ps?
  4. Cite os principais estados de processo no Linux e descreva o que cada um significa. Dê um exemplo de quando um processo pode estar no estado Z (zumbi).
  5. Usando o shell, escreva um pequeno script que imprima o PID do script e o PID do processo pai, e depois execute-o.

✓ Resposta: O comando é ps -ef ou ps aux. As colunas principais são: USER (dono), PID (ID do processo), %CPU (uso de CPU), %MEM (uso de memória), VSZ (tamanho virtual em KB), RSS (memória residente em KB), TTY (terminal), STAT (estado), START (hora de início) e COMMAND (comando executado).

✓ Resposta: Para visualizar a árvore a partir do PID 1, use pstree -p 1. Isso mostra o processo 1 (geralmente systemd) e todos os seus descendentes, com os PIDs.

✓ Resposta: PID é o identificador único do processo, enquanto PPID é o PID do processo pai. Para descobrir o PID e PPID de um processo específico, use ps -o pid,ppid -C nome_do_processo ou ps -o pid,ppid -p PID.

✓ Resposta: Os principais estados são: R (Running), S (Sleeping), D (Uninterruptible Sleep), T (Stopped), Z (Zombie) e I (Idle). Um processo zumbi ocorre quando o processo filho termina, mas o pai não chama a função wait() para coletar seu status, permanecendo na tabela de processos até que o pai seja encerrado ou trate isso.

✓ Resposta: Um script simples seria:
#!/bin/bash
echo "PID do script: $$"
echo "PPID do script: $PPID"
Salve como meu_script.sh, dê permissão de execução (chmod +x meu_script.sh) e execute ./meu_script.sh.

Referências