Linux: Gerenciamento de Processos

No Linux, um programa em execução é chamado de processo. Gerenciar processos — ver o que está rodando, quantos recursos está usando e como encerrá-lo de forma controlada — é uma habilidade essencial de administração de servidores.

📋 Pré-requisitos: Você já deve conhecer

1. O Que Você Vai Aprender


2. A História de um Serviço que Não Sobe

(1) O Problema: Porta Já em Uso

Xiaoming passou por isso ao iniciar um serviço em Node.js:

BASH
node server.js
# Error: listen EADDRINUSE: address already in use :::3000

A porta estava ocupada. Ele não sabia qual processo estava usando a porta 3000 nem como pará-lo.

(2) Localizar e Liberar a Porta

BASH
# Encontra o processo usando a porta 3000
ss -tlnp | grep 3000
# LISTEN 0 128 *:3000 *:* users:(("node",pid=1234,fd=20))

# Encerra o processo
kill 1234

# Reinicia o serviço
node server.js

(3) O Benefício: Conflitos de Porta Resolvidos

Xiaoming aprendeu a usar ss ou lsof para encontrar processos ocupando portas, e kill para enviar sinais e encerrá-los. Agora ele resolve conflitos de porta em 30 segundos.


3. Pontos-Chave

(1) ps — Instantâneo dos Processos

BASH
# Uso essencial
ps aux               # Informações detalhadas de todos os processos
ps aux | grep nginx  # Filtra processos específicos
ps -ef               # Formato padrão

# Significado dos campos comuns
# USER    PID  %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
# alice  1234  0.3  1.2 123456 54321 ?        Ssl  10:23   0:01 node server.js

# Saída personalizada
ps -eo pid,user,%cpu,%mem,comm --sort=-%cpu | head -10
Campo Significado
PID ID do processo
PPID ID do processo pai
%CPU Percentual de uso de CPU
%MEM Percentual de uso de memória
VSZ Tamanho da memória virtual (KB)
RSS Tamanho da memória física (KB)
STAT Estado do processo (R=executando, S=dormindo, D=ininterruptível, Z=zumbi, T=parado)
START Horário de início
TIME Tempo acumulado de CPU
COMMAND Nome do comando / linha de comando

(2) top/htop — Monitoramento em Tempo Real

TEXT
top                             # Inicia o top
top -o %MEM                     # Ordena por memória
top -u alice                    # Mostra só processos de um usuário
top -bn1 | head -20             # Saída em modo "snapshot"

# Atalhos com o top em execução
# P    Ordenar por CPU
# M    Ordenar por memória
# k    Encerrar processo (pede o PID)
# u    Filtrar por usuário
# q    Sair do top

# htop é uma versão turbinada do top (interface mais amigável, suporte a mouse)
htop

(3) kill — Enviar Sinais

BASH
kill PID                        # Envia SIGTERM (15), pede encerramento
kill -2 PID                     # Envia SIGINT (2), equivalente a Ctrl+C
kill -9 PID                     # Envia SIGKILL (9), encerramento forçado
kill -1 PID                     # Envia SIGHUP (1), recarrega configuração
kill -19 PID                    # Envia SIGSTOP (19), pausa o processo
kill -18 PID                    # Envia SIGCONT (18), retoma o processo

# Encerrar por nome
pkill -f "node server.js"       # Casa pela linha de comando
killall nginx                   # Encerra todos os processos com o mesmo nome
Sinal Número Significado
SIGHUP 1 Hangup (recarrega configuração)
SIGINT 2 Interrupção (Ctrl+C)
SIGQUIT 3 Quit (com core dump)
SIGKILL 9 Encerramento forçado (não pode ser capturado/ignorado)
SIGTERM 15 Pedido de encerramento (padrão)
SIGSTOP 19 Parar (não pode ser capturado/ignorado)
SIGCONT 18 Continuar execução

Princípio Fundamental: Tente primeiro kill PID (SIGTERM). Só use kill -9 PID (SIGKILL) se isso não funcionar. O SIGKILL não dá ao processo chance de se limpar, o que pode causar perda de dados.

⚠️ Atenção: kill -9 (SIGKILL) encerra o processo de forma brusca, sem chance de limpeza — arquivos abertos podem ficar corrompidos, transações de banco podem ser interrompidas, e arquivos temporários podem ficar para trás. Só use -9 quando kill PID (SIGTERM) não responder. Nunca use como atalho.

(4) Execução em Segundo Plano

TEXT
# & — Coloca em segundo plano
node server.js &                 # Devolve o terminal logo depois de iniciar

> 💡 Dica: Acrescentar `&` a um comando faz ele rodar em segundo plano, liberando o terminal imediatamente. Porém, com `&` sozinho o processo será encerrado quando a sessão do terminal fechar. Para manter o processo rodando mesmo após o terminal fechar, combine com `nohup`: `nohup command &`.
sleep 30 &                       # Roda o sleep em segundo plano

# jobs/fg/bg — Gerencia jobs em segundo plano
jobs                            # Lista jobs em segundo plano
# [1]+  Running                 node server.js &
# [2]-  Running                 sleep 30 &
fg %1                          # Traz o job 1 para o primeiro plano
bg %2                          # Retoma o job 2 pausado em segundo plano

# Ctrl+Z — Suspende o job atual em primeiro plano e coloca em segundo plano
# Ctrl+C — Encerra o job em primeiro plano

# nohup — Continua rodando depois que o terminal fecha
nohup node server.js &
nohup python app.py > app.log 2>&1 &

> ℹ️ Nota: `nohup` + `&` é a combinação padrão para comandos persistentes em segundo plano — o `nohup` ignora o sinal SIGHUP (enviado quando o terminal fecha), e o `&` coloca em segundo plano. A saída vai por padrão para `nohup.out`; é recomendável indicar manualmente um arquivo de log: `nohup command > app.log 2>&1 &`.

(5) ▶ Exemplo: Visualizar Processos

BASH
# Ver todos os processos
ps aux | head -10

# Ver processos de um usuário específico
ps -u alice -o pid,%cpu,%mem,comm

# Top 10 processos por uso de CPU
ps aux --sort=-%cpu | head -11

# Ver a árvore de processos
ps auxf | head -20

Saída:

TEXT
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 169344 13224 ?        Ss   10:00   0:02 /sbin/init
root         2  0.0  0.0      0     0 ?        S    10:00   0:00 [kthreadd]
alice     1234  0.3  1.2 123456 54321 ?        Ssl  10:23   0:01 node server.js
alice     2345  0.0  0.0   2345   567 pts/0    S+   10:30   0:00 ps aux
PID   USER     %CPU  %MEM  COMMAND
1234  alice    0.3   1.2   node
5678  bob      0.1   0.5   python3
USER   PID %CPU %MEM  COMMAND
root   1   0.0  0.1   /sbin/init
root   456 0.5  2.1   /usr/bin/containerd
alice  1234 8.2  3.4   node server.js
bob    2345 5.1  4.2   python train.py

(6) ▶ Exemplo: Monitoramento em Tempo Real

TEXT
# Inicia o top
top

# Operações dentro do top
# P → Ordena por CPU
# M → Ordena por memória
# k → Digite o PID, pressione Enter, digite o número do sinal (15 ou 9), pressione Enter
# q → Sair

# Modo não interativo
top -bn1 | head -15

Saída:

TEXT
top - 10:30:01 up  5:23,  2 users,  load average: 0.15, 0.10, 0.05
Tasks: 120 total,   1 running, 119 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.3 us,  0.8 sy,  0.0 ni, 96.5 id,  0.2 wa,  0.0 hi,  0.2 si
MiB Mem :   3936.0 total,    512.0 free,   2048.0 used,   1376.0 buff/cache

(7) ▶ Exemplo: Encerrar um Processo

BASH
# Inicia um processo em segundo plano
sleep 1000 &

# Localiza
ps aux | grep "sleep 1000"
# alice  5678  0.0  0.0   1234   567 pts/0    S    10:23   0:00 sleep 1000

# Encerramento controlado
kill 5678

# Se não funcionar
kill -9 5678

Saída:

TEXT
[1]+  Terminated              sleep 1000
alice  5678  0.0  0.0   1234   567 pts/0    S    10:23   0:00 sleep 1000
[1]+  Killed                  sleep 1000

(8) ▶ Exemplo: Execução em Segundo Plano na Prática

BASH
# Inicia uma tarefa demorada
nohup python train_model.py > train.log 2>&1 &

# Acompanha o log
tail -f train.log

# Mesmo depois de fechar o terminal, train_model.py continua rodando
# Ao logar de novo, ps aux vai mostrar que ele continua ativo

Saída:

TEXT
[1] 5678
[2026-07-07 10:23:01] Training epoch 1/100...
[2026-07-07 10:23:15] Loss: 0.5234
[2026-07-07 10:23:30] Training epoch 2/100...

(9) ▶ Exemplo: Ajuste de Prioridade com nice/renice

TEXT
# Faixa do nice: -20 (maior prioridade) a 19 (menor prioridade)

# Inicia com prioridade mais baixa
nice -n 10 ./heavy-task

# Ajusta a prioridade de um processo existente
renice -n 5 -p 1234

# Visualiza os valores nice dos processos
ps -eo pid,nice,comm | head -10

(10) ▶ Exemplo Abrangente: Gerenciamento de Serviço

BASH
#!/bin/bash
# manage-server.sh - Gerencia uma aplicação Node.js

APP_NAME="server.js"
APP_DIR="/home/alice/app"
PID_FILE="/tmp/app.pid"

start() {
    if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
        echo "App is already running (PID: $(cat $PID_FILE))"
        exit 1
    fi
    cd "$APP_DIR"
    nohup node "$APP_NAME" > app.log 2>&1 &
    echo $! > "$PID_FILE"
    echo "App started (PID: $!)"
}

stop() {
    if [ ! -f "$PID_FILE" ]; then
        echo "App is not running"
        exit 1
    fi
    PID=$(cat "$PID_FILE")
    echo "Stopping app (PID: $PID)..."
    kill "$PID" 2>/dev/null
    sleep 2
    if kill -0 "$PID" 2>/dev/null; then
        echo "Force killing..."
        kill -9 "$PID" 2>/dev/null
    fi
    rm -f "$PID_FILE"
    echo "Stopped"
}

status() {
    if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
        echo "Running (PID: $(cat $PID_FILE))"
        ps -p $(cat "$PID_FILE") -o pid,%cpu,%mem,etime,comm
    else
        echo "Not running"
    fi
}

case "${1:-status}" in
    start) start ;;
    stop) stop ;;
    restart) stop; start ;;
    *) status ;;
esac

❓ Perguntas Frequentes

P: Por que kill -9 é arriscado? R: kill -9 (SIGKILL) força o processo a encerrar imediatamente, sem nenhuma limpeza — arquivos abertos podem ficar corrompidos, transações de banco podem ser interrompidas, e arquivos temporários podem ficar para trás. Só use quando kill PID (SIGTERM) não estiver respondendo.

P: O que é um processo Zumbi? R: É um processo que terminou, mas cujo pai ainda não leu seu status de saída. Ele deixa uma entrada "zumbi" na tabela de processos (STAT=Z). O zumbi em si não consome recursos, mas muitos zumbis podem esgotar a tabela de processos. Normalmente é preciso encerrar ou reiniciar o processo pai para limpá-los.

P: Qual a diferença entre nohup e disown? R: nohup configura o processo para ignorar o SIGHUP na inicialização (sinal enviado quando o terminal fecha). disown é um built-in do bash que remove um job já iniciado da tabela de jobs do shell. nohup command & é a abordagem mais comum.

P: Como limitar o uso de CPU de um processo? R: Use cpulimit: cpulimit -l 50 -p PID limita a 50% de CPU. Ou use nice para reduzir a prioridade. Em containers Docker, use --cpus para limitar.

P: Como descobrir qual processo está usando uma porta específica? R: Use ss -tlnp | grep :PORTA (recomendado) ou lsof -i :PORTA (precisa do lsof) ou fuser PORTA/tcp.


📖 Resumo


📝 Exercícios

  1. Básico (⭐): Use ps aux --sort=-%cpu para encontrar os 3 processos com maior uso de CPU, depois inicie sleep 300 &, visualize com jobs e encerre com kill
  2. Intermediário (⭐⭐): Use nohup para iniciar um comando de longa duração, feche o terminal, reabra e confirme que ele continua rodando. Em seguida, use ss -tlnp para ver todas as portas em escuta e os processos associados
  3. Avançado (⭐⭐⭐): Escreva um script de gerenciamento de processos com start/stop/status/restart, usando um arquivo PID para rastrear o processo e implementando encerramento controlado (SIGTERM primeiro, espera 3 segundos, depois SIGKILL)
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%