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) htopinstalado (apt install htopoudnf 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
| Coluna | Significado |
|---|---|
| USER | Proprietário do processo |
| PID | ID do processo |
| %CPU | Uso de CPU desde o início do processo |
| %MEM | Memória residente como % da RAM total |
| VSZ | Tamanho de memória virtual (KB) |
| RSS | Resident Set Size — RAM real usada (KB) |
| STAT | Estado do processo (R=executando, S=dormindo, Z=zumbi, T=parado) |
| COMMAND | Linha 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:
| Tecla | Ação |
|---|---|
P | Ordenar por uso de CPU |
M | Ordenar por uso de memória |
T | Ordenar por tempo de CPU acumulado |
k | Solicitar um PID para matar |
r | Renice um processo |
1 | Alternar visualização por núcleo de CPU |
u | Filtrar por nome de usuário |
f | Abrir gerenciador de campos (adicionar/remover colunas) |
q | Sair |
d | Alterar intervalo de atualização (segundos) |
H | Mostrar 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:
| Tecla | Ação |
|---|---|
F2 | Configuração (cores, colunas, medidores) |
F3 | Pesquisar lista de processos |
F4 | Filtrar (mostrar apenas processos correspondentes) |
F5 | Visualização em árvore (hierarquia de processos) |
F6 | Seletor de coluna de ordenação |
F9 | Enviar sinal ao processo selecionado |
F10 | Sair |
| Teclas de seta | Navegar na lista de processos |
Space | Marcar 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
| Recurso | ps | top | htop | pgrep/pkill |
|---|---|---|---|---|
| Atualização ao vivo | Não | Sim | Sim | Não |
| Suporte a mouse | Não | Limitado | Sim | Não |
| Visualização em árvore | flag --forest | Não | F5 | Não |
| Enviar sinais | Não | tecla k | F9 | Diretamente |
| Filtro/pesquisa | Pipe para grep | tecla u | F4/F3 | Por padrão/regex |
| Saída colorida | Não | Básica | Rica | Não |
| Amigável para scripts | Excelente | Ruim | Ruim | Excelente |
| Instalação necessária | Nativo | Nativo | Sim | Nativo |
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:
| Sinal | Número | Ação padrão | Caso de uso |
|---|---|---|---|
| SIGTERM | 15 | Encerramento gracioso | Parada normal — permite limpeza |
| SIGKILL | 9 | Morte imediata | Processo ignora SIGTERM |
| SIGHUP | 1 | Recarregar configuração | Dizer a daemons para reler a configuração |
| SIGSTOP | 19 | Pausar (não bloqueável) | Suspender um processo |
| SIGCONT | 18 | Retomar | Retomar um processo parado |
| SIGUSR1/2 | 10/12 | Definido pelo usuário | Especí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 auxfornece um snapshot ordenado por CPU ou memória; use--forestpara uma visualização em árvore.topehtopfornecem monitoramento ao vivo;htopadiciona 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/pgrepsão alternativas amigáveis para scripts aokillquando você sabe um nome em vez de um PID.nice/reniceajustam a prioridade de agendamento (-20 a 19); valores negativos requerem root.bg/fg/jobsgerenciam o controle de jobs do shell; usenohupoutmuxpara sobreviver ao logout./proc/<PID>/é a fonte da verdade —status,cmdline,fd/emapsrevelam tudo sobre um processo em execução.