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
- Aula 3: Fundamentos do Terminal
1. O Que Você Vai Aprender
- ps: ver a lista de processos
- top/htop: monitoramento em tempo real
- kill vs kill -9
- Execução em segundo plano (& / nohup / disown)
- Prioridade de processo com nice
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:
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
# 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
# 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
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
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ó usekill -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.
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
# & — 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
# 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:
TEXTUSER 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
# 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:
TEXTtop - 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
# 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
# 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
# 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
#!/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 quandokill 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:
nohupconfigura 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 PIDlimita a 50% de CPU. Ou usenicepara reduzir a prioridade. Em containers Docker, use--cpuspara limitar.
P: Como descobrir qual processo está usando uma porta específica? R: Use
ss -tlnp | grep :PORTA(recomendado) oulsof -i :PORTA(precisa do lsof) oufuser PORTA/tcp.
📖 Resumo
ps auxpara instantâneo de processos,top/htoppara monitoramento em tempo real- Hierarquia de sinais: SIGTERM (15) encerramento controlado → SIGKILL (9) encerramento forçado
¶ segundo plano,jobs/fg/bgpara gerenciar jobsnohup command &continua rodando mesmo depois do terminal fecharnice -n 10 commandajusta a prioridade
📝 Exercícios
- Básico (⭐): Use
ps aux --sort=-%cpupara encontrar os 3 processos com maior uso de CPU, depois iniciesleep 300 &, visualize comjobse encerre comkill - Intermediário (⭐⭐): Use
nohuppara iniciar um comando de longa duração, feche o terminal, reabra e confirme que ele continua rodando. Em seguida, usess -tlnppara ver todas as portas em escuta e os processos associados - 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)