Processos são programas em execução no sistema operacional. Cada vez que você executa um comando, um script ou um aplicativo, o kernel do Linux cria um processo para gerenciar essa execução. Compreender como os processos funcionam é essencial para administrar sistemas, diagnosticar problemas e otimizar o desempenho. Nesta aula, vamos explorar as ferramentas básicas para visualizar processos (ps e pstree), entender os identificadores de processo (PID e PPID) e conhecer os estados pelos quais um processo pode passar.

O Linux é um sistema multitarefa, ou seja, ele executa vários processos simultaneamente, alternando entre eles de forma rápida. Para isso, o kernel mantém uma tabela de processos com informações como identificador, estado, uso de CPU e memória. Saber interpretar essas informações é uma habilidade valiosa para qualquer usuário de Linux, especialmente para desenvolvedores e administradores de sistemas.

ps

O comando ps (process status) é uma das ferramentas mais utilizadas para visualizar processos em execução no sistema. Ele fornece um instantâneo dos processos atuais, com várias opções para personalizar a saída. Sem argumentos, ps exibe apenas os processos associados ao terminal atual, o que geralmente é pouco informativo.

Para obter uma visão completa de todos os processos do sistema, utiliza-se a combinação de opções aux (ou -ef). A sintaxe ps aux é bastante comum e mostra todos os processos, com informações como usuário, PID, uso de CPU e memória, comando executado, entre outras. Já ps -ef exibe uma saída semelhante, mas com um formato diferente. A escolha entre elas é uma questão de preferência ou de necessidade de campos específicos.

# Exibe todos os processos do sistema
ps aux

# Exibe todos os processos em formato padrão POSIX
ps -ef

# Exibe processos de um usuário específico
ps -u root

# Exibe a árvore de processos (processos pai e filho)
ps -ejH

Além disso, o ps permite selecionar processos por nome, PID ou outros critérios. Por exemplo, para ver apenas os processos do navegador Firefox, você pode usar ps aux | grep firefox. O comando ps é frequentemente combinado com grep para filtrar a saída. No entanto, é importante lembrar que o próprio grep aparece na listagem, o que pode ser evitado com grep -v grep ou usando pgrep.

pstree

O comando pstree exibe os processos em forma de árvore, mostrando a hierarquia de processos pai e filho. Isso é útil para visualizar como os processos estão relacionados, especialmente quando um processo inicia outros. Por exemplo, quando você executa um comando no shell, ele geralmente cria um processo filho para executar o comando, e o pstree mostra essa relação de forma clara.

A saída do pstree é mais compacta que a do ps, pois agrupa processos com nomes semelhantes. Por padrão, ele mostra todos os processos do sistema, mas você pode especificar um PID para ver apenas a árvore a partir daquele processo. Além disso, a opção -p exibe os PIDs ao lado de cada processo, o que ajuda a correlacionar com outras ferramentas.

# Exibe a árvore de processos completa
pstree

# Exibe a árvore a partir do processo com PID 1 (init)
pstree 1

# Exibe a árvore com PIDs
pstree -p

# Exibe a árvore com a linha de comando completa
pstree -a

O pstree é particularmente útil para identificar processos que estão sendo executados em segundo plano e como eles se relacionam. Por exemplo, se um serviço como o Apache estiver rodando, você verá o processo principal e vários filhos, cada um lidando com requisições.

PID e PPID

PID (Process ID) é um número único atribuído a cada processo pelo kernel. Esse identificador é usado para controlar e gerenciar o processo, como enviar sinais ou alterar prioridades. O PPID (Parent Process ID) é o PID do processo pai que criou o processo atual. Todo processo, exceto o primeiro (init ou systemd), tem um pai.

Quando você executa um comando no shell, o shell (por exemplo, bash) cria um processo filho para executar o comando. O PID do processo filho é diferente do PID do shell, mas o PPID do filho é o PID do shell. Essa hierarquia é fundamental para o funcionamento do sistema, pois permite que processos sejam agrupados e gerenciados em conjunto.

Para descobrir o PID e o PPID de um processo, você pode usar o comando ps com as opções apropriadas. Por exemplo, ps -o pid,ppid,cmd exibe essas informações. Além disso, dentro de um script, as variáveis especiais $$ (PID do shell atual) e $PPID (PID do processo pai) podem ser usadas para obter esses valores.

# Exibe PID, PPID e comando de todos os processos
ps -o pid,ppid,cmd

# Dentro de um script, mostra o PID do shell e o PPID
#!/bin/bash
echo "PID do shell: $$"
echo "PPID do shell: $PPID"

Estados de processo

Em um sistema Linux, um processo pode estar em diferentes estados, dependendo do que está fazendo e se está esperando por recursos. Os principais estados são: Running (em execução), Sleeping (em espera), Stopped (parado) e Zombie (zumbi). Cada estado é representado por uma letra na coluna STAT do comando ps.

  • R (Running): O processo está em execução ou na fila para ser executado.
  • S (Sleeping): O processo está esperando por um evento (como entrada do usuário ou conclusão de I/O). É o estado mais comum.
  • D (Uninterruptible Sleep): O processo está em espera por I/O e não pode ser interrompido, geralmente aguardando disco ou rede.
  • Z (Zombie): O processo já terminou, mas ainda está na tabela de processos porque o pai não coletou o status de saída.
  • T (Stopped): O processo foi interrompido, geralmente por um sinal como SIGSTOP ou Ctrl+Z.
  • I (Idle): Processo do kernel em espera.

O estado de um processo pode mudar ao longo do tempo. Por exemplo, um processo em execução pode entrar em estado de espera quando precisa de I/O, e depois voltar a executar. O estado zombi é indesejado e ocorre quando o processo pai não chama wait() para coletar o status do filho. Isso pode ser resolvido matando o processo pai ou reiniciando o sistema.

Para visualizar o estado de um processo, use ps e observe a coluna STAT. Por exemplo, ps aux | grep firefox mostrará a letra correspondente ao estado. A coluna STAT pode conter letras adicionais, como s (líder de sessão) ou l (multithread).

# Exibe todos os processos com estado
ps aux

# Exibe apenas processos com estado Zombie (exemplo)
ps aux | awk '$8 ~ /Z/'

# Exibe processos de um usuário com estado
ps -u $USER -o pid,stat,cmd

Boas práticas e observações

Ao trabalhar com processos, é importante ter cautela ao usar comandos como kill ou pkill, pois podem encerrar processos críticos do sistema. Sempre verifique o PID e o nome do processo antes de agir. Além disso, utilize ps e pstree para entender a hierarquia e identificar processos que consomem muitos recursos.

Para monitoramento em tempo real, o comando top ou htop é mais adequado, pois atualiza a lista de processos continuamente. O htop oferece uma interface interativa e colorida, facilitando a visualização. No entanto, o ps é útil para capturar um instantâneo e para uso em scripts.

Referências

Exercícios

  1. Explique a diferença entre PID e PPID, e como você pode descobrir o PPID de um processo usando o comando ps.
  2. ✓ Resposta: O PID (Process ID) é o identificador único atribuído a cada processo, enquanto o PPID (Parent Process ID) é o PID do processo pai que criou o processo atual. Para descobrir o PPID de um processo, você pode usar o comando ps -o pid,ppid,cmd -p <PID> ou ps -ef e localizar a coluna PPID. Por exemplo, ps -o pid,ppid,cmd -p 1234.
  3. Qual é a utilidade do comando pstree em relação ao ps? Dê um exemplo de situação em que pstree seja mais adequado.
  4. ✓ Resposta: O comando pstree mostra a hierarquia de processos de forma visual, em forma de árvore, enquanto ps lista processos de forma linear. pstree é mais adequado quando se quer entender a relação pai-filho entre processos, por exemplo, para ver como um serviço como o Apache cria processos filhos para lidar com requisições. Exemplo: pstree -p exibe a árvore com PIDs.
  5. Escreva um comando ps que exiba apenas o PID, o PPID, o estado e o comando de todos os processos do usuário atual.
  6. ✓ Resposta: O comando ps -u $USER -o pid,ppid,stat,cmd exibe os processos do usuário atual com as colunas PID, PPID, estado (STAT) e comando (CMD).
  7. O que é um processo zumbi? Como ele é criado e como pode ser eliminado?
  8. ✓ Resposta: Um processo zumbi é um processo que já terminou sua execução, mas ainda permanece na tabela de processos porque o processo pai não chamou a função wait() para coletar seu status de saída. Ele é criado quando o pai não trata o término do filho. Para eliminá-lo, é necessário que o processo pai seja encerrado ou chame wait(); se o pai for encerrado, o processo zumbi será adotado pelo init/systemd e eventualmente limpo. Não é possível matar um zumbi diretamente com kill.
  9. Explique os estados de processo mais comuns no Linux (R, S, D, Z, T) e dê um exemplo de quando cada um pode ocorrer.
  10. ✓ Resposta: Os estados mais comuns são: R (Running) - processo em execução ou na fila, como um loop infinito; S (Sleeping) - processo esperando por um evento, como um servidor aguardando conexão; D (Uninterruptible Sleep) - processo aguardando I/O, como uma operação de disco; Z (Zombie) - processo terminado que não foi coletado pelo pai; T (Stopped) - processo interrompido, como quando se pressiona Ctrl+Z em um comando. Exemplos: R: while true; do :; done; S: sleep 100; D: um processo de cópia de arquivo grande; Z: quando um programa filho termina e o pai não chama wait(); T: um processo pausado com Ctrl+Z.