Gerenciamento de processos Linux é uma habilidade essencial de sysadmin — seja você caçando um processo que consumiu toda a CPU, parando graciosamente um daemon com comportamento incorreto ou ajustando a prioridade de agendamento para um job em lote, saber como inspecionar e controlar processos mantém os sistemas saudáveis. Este guia cobre o conjunto completo de ferramentas: ps aux, top, htop, sinais kill, nice/renice, jobs em segundo plano e o sistema de arquivos /proc, com exemplos práticos que você pode usar imediatamente.

Pré-requisitos

  • Um sistema Linux (qualquer distribuição — Ubuntu, Debian, RHEL, Fedora, Arch)
  • Acesso ao terminal com uma conta de usuário regular (alguns comandos requerem sudo)
  • htop instalado (apt install htop ou dnf install htop) para a seção do htop
  • Familiaridade básica com a linha de comando

Listando Processos com ps

ps (process status) é a ferramenta clássica de snapshot. Ele lê o /proc e imprime o estado atual do processo no momento em que você o executa — ao contrário do top, ele não é atualizado automaticamente.

ps aux — sintaxe BSD

ps aux
ColunaSignificado
USERProprietário do processo
PIDID do processo
%CPUUso de CPU desde o início do processo
%MEMMemória residente como % da RAM total
VSZTamanho de memória virtual (KB)
RSSResident Set Size — RAM real usada (KB)
STATEstado do processo (R=executando, S=dormindo, Z=zumbi, T=parado)
COMMANDLinha de comando completa

Ordenar por CPU e mostrar os maiores infratores:

ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20

Encontrar processos pelo nome sem que grep apareça nos resultados:

ps aux | grep '[n]ginx'

ps -ef — sintaxe UNIX

ps -ef

ps -ef adiciona a coluna PPID (PID do processo pai), que é indispensável ao rastrear árvores de processos. Use -eH ou --forest para uma visualização em árvore:

ps -eH
ps -ef --forest

Estados de processo decodificados

  • R — executável (na CPU ou na fila de execução)
  • S — sono interrompível (aguardando I/O ou um evento)
  • D — sono não interrompível (geralmente I/O de disco — não pode ser morto)
  • Z — zumbi (finalizado, mas o pai ainda não o coletou)
  • T — parado (Ctrl+Z ou SIGSTOP)

Uma alta contagem de processos no estado D indica saturação de I/O. Zumbis Z são inofensivos em pequenas quantidades, mas indicam que um processo pai não está chamando wait().

Monitoramento Interativo com top

top fornece uma visualização ao vivo com atualização automática (intervalo padrão de 3 segundos). Inicie-o e use estes atalhos de teclado:

TeclaAção
POrdenar por uso de CPU
MOrdenar por uso de memória
TOrdenar por tempo de CPU acumulado
kSolicitar um PID para matar
rRenice um processo
1Alternar visualização por núcleo de CPU
uFiltrar por nome de usuário
fAbrir gerenciador de campos (adicionar/remover colunas)
qSair
dAlterar intervalo de atualização (segundos)
HMostrar threads individuais em vez de processos

O cabeçalho resume as médias de carga (1, 5, 15 minutos), detalhamento de CPU (us/sy/id/wa) e memória. Um wa (espera de I/O) acima de 10-15% geralmente indica um gargalo de armazenamento.

Execute top de forma não interativa para capturar um snapshot:

top -bn1 | head -30

Monitoramento de Processos Mais Rico com htop

htop é o top com uma interface colorida, suporte a mouse e controles mais intuitivos. Após instalar e iniciar, a barra de teclas de função na parte inferior o guia:

TeclaAção
F2Configuração (cores, colunas, medidores)
F3Pesquisar lista de processos
F4Filtrar (mostrar apenas processos correspondentes)
F5Visualização em árvore (hierarquia de processos)
F6Seletor de coluna de ordenação
F9Enviar sinal ao processo selecionado
F10Sair
Teclas de setaNavegar na lista de processos
SpaceMarcar um processo para ação em massa

htop mostra barras de CPU por núcleo, barras de memória e swap, e permite rolar horizontalmente para ver linhas de comando longas — tudo que o top exige teclas extras para revelar.

Comparação de Ferramentas de Gerenciamento de Processos

Recursopstophtoppgrep/pkill
Atualização ao vivoNãoSimSimNão
Suporte a mouseNãoLimitadoSimNão
Visualização em árvoreflag --forestNãoF5Não
Enviar sinaisNãotecla kF9Diretamente
Filtro/pesquisaPipe para greptecla uF4/F3Por padrão/regex
Saída coloridaNãoBásicaRicaNão
Amigável para scriptsExcelenteRuimRuimExcelente
Instalação necessáriaNativoNativoSimNativo

Use ps e pgrep/pkill em scripts; use top ou htop interativamente em servidores.

Enviando Sinais: kill, pkill, killall

Sinais são o principal mecanismo de IPC para controle de processos. Os mais importantes:

SinalNúmeroAção padrãoCaso de uso
SIGTERM15Encerramento graciosoParada normal — permite limpeza
SIGKILL9Morte imediataProcesso ignora SIGTERM
SIGHUP1Recarregar configuraçãoDizer a daemons para reler a configuração
SIGSTOP19Pausar (não bloqueável)Suspender um processo
SIGCONT18RetomarRetomar um processo parado
SIGUSR1/210/12Definido pelo usuárioEspecífico da aplicação (ex.: rotação de log)

kill por PID

kill 1234          # SIGTERM — pedir com educação
kill -15 1234      # SIGTERM explícito
kill -9 1234       # SIGKILL — sem misericórdia
kill -HUP 1234     # recarregar configuração
kill -l            # listar todos os nomes de sinal

Sempre tente SIGTERM primeiro. Dê ao processo 10-30 segundos, então escale para SIGKILL se necessário.

pkill e pgrep — corresponder por nome ou padrão

pgrep nginx                # listar PIDs correspondendo a "nginx"
pgrep -u www-data nginx    # restringir a um usuário específico
pkill nginx                # SIGTERM para todos os processos correspondentes
pkill -9 nginx             # SIGKILL para todos os correspondentes
pkill -HUP nginx           # recarregar configuração do nginx (mesmo que kill -HUP $(pgrep nginx))

killall — matar todas as instâncias pelo nome exato

killall firefox
killall -9 java
killall -u jcarlos          # matar todos os processos de um usuário

pkill aceita regex e correspondências parciais; killall requer o nome exato do processo. Prefira pkill em scripts.

Ajuste de Prioridade com nice e renice

O Linux agenda processos usando um valor de niceness de -20 (maior prioridade, menos “simpático” com os outros) a 19 (menor prioridade). O padrão é 0. Somente root pode definir valores negativos.

nice — definir prioridade na inicialização

nice -n 19 tar -czf backup.tar.gz /var/data   # backup em segundo plano, baixa prioridade
nice -n -5 ./realtime-processor                # maior prioridade (requer sudo)
sudo nice -n -10 ./critical-task

renice — ajustar um processo em execução

renice -n 10 -p 1234         # diminuir prioridade do PID 1234
sudo renice -n -5 -p 1234    # aumentar prioridade (root necessário)
renice -n 15 -u jcarlos      # diminuir prioridade para todos os processos do usuário

Verificar a niceness atual com ps:

ps -o pid,ni,comm -p 1234

Jobs em Segundo Plano: bg, fg e jobs

O controle de jobs do shell permite gerenciar múltiplas tarefas sem abrir terminais extras.

long-running-command &        # iniciar diretamente em segundo plano
./script.sh                   # executando em primeiro plano
# pressione Ctrl+Z para suspender
[1]+  Stopped    ./script.sh

jobs                          # listar jobs
# [1]+  Stopped    ./script.sh
# [2]-  Running    long-running-command &

bg %1                         # retomar job 1 em segundo plano
fg %1                         # trazer job 1 para primeiro plano
fg %2                         # trazer job 2 para primeiro plano

disown %1                     # desanexar job do shell (sobrevive ao logout)
nohup ./script.sh &           # imune a SIGHUP, saída para nohup.out

& e bg ainda vinculam o processo à sessão do terminal. Use nohup, screen ou tmux para jobs que devem sobreviver ao logout.

Explorando /proc

Tudo que ps e top sabem vem do sistema de arquivos virtual /proc — uma janela ao vivo para a tabela de processos do kernel.

ls /proc/1234/           # todos os arquivos para o PID 1234
cat /proc/1234/status    # status legível por humanos (Name, State, VmRSS, Threads…)
cat /proc/1234/cmdline   # linha de comando completa (separada por null)
cat /proc/1234/environ   # variáveis de ambiente na inicialização
ls -l /proc/1234/fd/     # descritores de arquivo abertos (sockets, pipes, arquivos)
cat /proc/1234/maps      # mapa de memória
cat /proc/self/status    # informações sobre o processo shell atual

Arquivos /proc úteis de todo o sistema:

cat /proc/loadavg        # carga de 1m, 5m, 15m + processos em execução/total
cat /proc/meminfo        # estatísticas detalhadas de memória
cat /proc/cpuinfo        # detalhes de CPU por núcleo
cat /proc/uptime         # tempo de atividade do sistema em segundos

Cenário Real: Pico de CPU em Servidor de Produção

Você tem um servidor web de produção que de repente atinge 100% de CPU. Aqui está o plano de ação:

# 1. Identificar o culpado
ps aux --sort=-%cpu | head -10

# 2. Obter mais detalhes (arquivos abertos, conexões de rede)
PID=<pid infrator>
ls -l /proc/$PID/fd | wc -l     # contagem de descritores de arquivo
cat /proc/$PID/status            # verificar threads, memória
cat /proc/$PID/cmdline           # comando exato

# 3. Tentar uma parada graciosa primeiro
kill -15 $PID
sleep 15

# 4. Verificar se parou
ps -p $PID

# 5. Forçar encerramento se ainda estiver em execução
kill -9 $PID

# 6. Se for um serviço, reiniciar corretamente
sudo systemctl restart myapp

Se o processo for um daemon conhecido, kill -HUP pode ser tudo que você precisa para limpar um estado travado sem uma reinicialização completa.

Armadilhas e Casos Especiais

SIGKILL não pode ser capturado ou ignorado. Um processo em sono não interrompível (estado D, aguardando I/O) não responderá ao SIGKILL até que o I/O seja concluído. Nesse caso, o dispositivo subjacente ou a montagem NFS geralmente é o problema.

Processos zumbi não são um vazamento. Um zumbi (estado Z) ocupa um PID, mas nenhum recurso. Ele desaparece quando o pai chama wait(). Se zumbis se acumulam, o processo pai tem um bug — matar o pai ou corrigi-lo é a solução, não matar o zumbi diretamente.

%CPU do ps é média ao longo da vida, não atual. O %CPU em ps aux é calculado ao longo da vida útil do processo. Um processo que teve um pico ontem e agora está ocioso mostra um número baixo. Use top ou htop para CPU em tempo real.

nice requer root para valores negativos. Usuários regulares só podem aumentar a niceness (diminuir a prioridade). Digitar nice -10 incorretamente (que o bash interpreta como flag -1 0) é um erro comum — sempre use nice -n 10.

pkill corresponde substrings. pkill python matará python3, python2 e qualquer processo com “python” em seu nome — incluindo seu editor se ele incorporar um interpretador Python. Use pgrep primeiro para verificar o que será correspondido.

Controle de jobs é por shell. jobs mostra apenas jobs iniciados na sessão do shell atual. Use ps aux | grep comando para encontrar processos desanexados.

Solução de Problemas

“Operation not permitted” ao matar um processo — você está tentando matar um processo de outro usuário ou um processo root. Use sudo kill PID.

Processo reinicia imediatamente após ser morto — um supervisor (systemd, supervisord, Docker) está reiniciando-o. Pare o serviço com sudo systemctl stop nome-do-servico em vez disso.

kill -9 não funciona — o processo está no estado D (sono não interrompível). Verifique iostat -x 1 para espera de I/O; o dispositivo de bloco ou sistema de arquivos de rede está travado. Uma reinicialização pode ser necessária em casos extremos.

htop mostra uso de swap aumentando — seu sistema está com pressão de memória. Use ps aux --sort=-%mem | head -10 para encontrar os maiores consumidores e considere adicionar swap ou reiniciar a aplicação infratora.

Média de carga alta, mas uso de CPU baixo — processos estão aguardando I/O, não CPU. Verifique iostat, iotop e contagens de estado D com ps aux | awk '$8 ~ /D/ {print}'.

Resumo

  • ps aux fornece um snapshot ordenado por CPU ou memória; use --forest para uma visualização em árvore.
  • top e htop fornecem monitoramento ao vivo; htop adiciona cores, suporte a mouse e atalhos de tecla F.
  • Sinais: sempre tente SIGTERM (15) primeiro, escale para SIGKILL (9) somente se necessário; SIGHUP (1) recarrega a maioria dos daemons.
  • pkill / pgrep são alternativas amigáveis para scripts ao kill quando você sabe um nome em vez de um PID.
  • nice / renice ajustam a prioridade de agendamento (-20 a 19); valores negativos requerem root.
  • bg / fg / jobs gerenciam o controle de jobs do shell; use nohup ou tmux para sobreviver ao logout.
  • /proc/<PID>/ é a fonte da verdade — status, cmdline, fd/ e maps revelam tudo sobre um processo em execução.

Artigos Relacionados