Processos e gerenciamento de jobs: ps, top, kill e signals
1. Introdução aos Processos no Linux
No Linux, um processo é uma instância em execução de um programa. Cada processo recebe um identificador único chamado PID (Process ID) e conhece seu processo pai através do PPID (Parent Process ID). O ciclo de vida de um processo começa quando ele é criado (geralmente via fork()) e termina quando finaliza sua execução ou é encerrado por um sinal.
Os processos podem executar em dois modos:
- Foreground: ocupam o terminal, bloqueando novas entradas até finalizarem
- Background: executam em segundo plano, liberando o terminal para outros comandos
A hierarquia de processos começa com o init (PID 1), ancestral de todos os processos do sistema. No systemd, o init é substituído pelo /lib/systemd/systemd.
2. Monitoramento de Processos com ps
O comando ps (process status) é a ferramenta fundamental para inspecionar processos em um dado momento.
Uso básico
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 167936 13696 ? Ss 10:15 0:02 /sbin/init
joao 1234 2.5 1.2 345678 50000 pts/0 Rl+ 11:30 0:15 firefox
Colunas essenciais
- STAT: estado do processo (R=executando, S=dormindo, Z=zumbi)
- %CPU: uso percentual de CPU
- %MEM: uso percentual de memória RAM
- TIME: tempo total de CPU consumido
- COMMAND: comando que originou o processo
Opções avançadas
Para personalizar a saída:
$ ps -eo pid,ppid,user,stat,comm --sort=-%cpu | head -10
PID PPID USER STAT COMMAND
1234 1 joao Rl+ firefox
5678 1234 joao S firefox-esr
Para visualizar a árvore de processos:
$ ps --forest -eo pid,ppid,user,comm
PID PPID USER COMMAND
1 0 root systemd
789 1 root └─sshd
790 789 root └─sshd
791 790 joao └─bash
3. Monitoramento Dinâmico com top e htop
Enquanto ps mostra um instantâneo, top atualiza continuamente as informações.
Comandos interativos do top
$ top
top - 14:23:45 up 2 days, 3:15, 2 users, load average: 0.45, 0.30, 0.25
Tasks: 245 total, 2 running, 243 sleeping, 0 stopped, 0 zombie
%Cpu(s): 8.3 us, 2.1 sy, 0.0 ni, 89.3 id, 0.3 wa, 0.0 hi, 0.0 si
KiB Mem : 8000000 total, 2000000 free, 3000000 used, 3000000 buff/cache
Dentro do top, teclas importantes:
- P: ordenar por %CPU
- M: ordenar por %MEM
- k: matar um processo (solicita PID e sinal)
- r: renice (alterar prioridade)
- q: sair
Alternativas modernas
$ htop
$ btop
$ atop
htop oferece navegação com setas, árvore visual e cores. btop é mais moderno com gráficos. atop grava logs históricos.
4. Controle de Jobs no Shell
O shell permite gerenciar múltiplos processos como "jobs".
Iniciando jobs em background
$ sleep 100 &
[1] 12345
$ find / -name "*.conf" > resultados.txt 2>&1 &
[2] 12346
Gerenciando jobs
$ jobs
[1]- Running sleep 100 &
[2]+ Running find / -name "*.conf" > resultados.txt 2>&1 &
$ fg %1 # traz job 1 para foreground
$ bg %2 # envia job 2 para background (se suspenso)
Suspensão e retomada
$ cat /dev/urandom > /dev/null
^Z
[1]+ Stopped cat /dev/urandom > /dev/null
$ bg %1
[1]+ cat /dev/urandom > /dev/null &
5. Sinais e Encerramento de Processos com kill
Sinais são notificações enviadas a processos. O comando kill envia sinais.
Sinais comuns
| Sinal | Número | Descrição |
|---|---|---|
| SIGTERM | 15 | Terminação gentil (padrão) |
| SIGKILL | 9 | Terminação forçada (não ignorável) |
| SIGHUP | 1 | Reiniciar configuração |
| SIGSTOP | 19 | Pausar execução |
| SIGCONT | 18 | Continuar execução pausada |
Exemplos práticos
$ kill 1234 # SIGTERM (15)
$ kill -9 1234 # SIGKILL - forçado
$ kill -SIGTERM 1234 # usando nome do sinal
$ killall firefox # mata todos os processos firefox
$ killall -9 chrome # força encerramento do chrome
Sinais seguros vs forçados
- SIGTERM (15): permite que o processo salve dados e libere recursos
- SIGKILL (9): mata imediatamente, sem chance de limpeza
- SIGHUP (1): útil para reiniciar daemons sem encerrá-los
6. Comandos Complementares: nice, renice e pkill
Prioridade de processos (nice)
O valor nice varia de -20 (maior prioridade) a 19 (menor prioridade). O padrão é 0.
$ nice -n 10 ./script_demorado.sh # inicia com prioridade baixa
$ renice -n 5 -p 1234 # altera prioridade do PID 1234
$ renice -n -5 -u joao # altera prioridade de todos os processos do usuário
Matando por nome
$ pkill -f "python servidor.py" # mata por nome do comando
$ pgrep -l firefox # lista PIDs do firefox
$ pkill -9 -u joao # mata todos os processos do usuário
7. Depuração e Análise de Processos
Rastreamento com strace
$ strace -p 1234 # anexa ao processo 1234
$ strace -e open,read ls # monitora apenas open e read
Arquivos abertos com lsof
$ lsof -p 1234 # arquivos abertos pelo PID 1234
$ lsof -i :80 # processos usando porta 80
$ ls -la /proc/1234/fd/ # lista descritores de arquivo
Processos zumbis e órfãos
- Zumbi: processo que terminou mas o pai não coletou o status (aparece como
Znops) - Órfão: processo cujo pai morreu; é adotado pelo init (PID 1)
$ ps aux | grep Z # localizar zumbis
$ kill -9 <PID_PAI> # forçar pai a coletar (se possível)
8. Boas Práticas e Troubleshooting
Evitando problemas
- Sempre prefira
SIGTERMantes deSIGKILL - Use
nohuppara processos que devem continuar após logout:
text $ nohup ./meu_servidor.sh & - Monitore jobs com
watch -n 1 'ps aux --sort=-%cpu | head'
Exemplo prático: diagnosticar processo travado
# 1. Identificar processo com alta CPU
$ top -bn1 | head -20
# 2. Verificar detalhes
$ ps -p 1234 -o pid,ppid,user,stat,comm,%cpu,%mem
# 3. Encerrar gradualmente
$ kill 1234 # SIGTERM
$ sleep 5
$ ps -p 1234 && kill -9 1234 # se ainda existir, força
# 4. Verificar se ficou zumbi
$ ps aux | grep 'Z'
Estratégias seguras
- Identifique o processo com
psoutop - Comunique com SIGTERM (kill padrão)
- Aguarde alguns segundos
- Force com SIGKILL se necessário
- Verifique se não restaram zumbis
Referências
- Manual oficial do comando ps (Linux man page) — Documentação completa com todas as opções e exemplos do ps
- Documentação do top (Linux man page) — Guia detalhado sobre o monitor interativo top e seus comandos
- Guia de sinais Linux (signal man page) — Lista completa de sinais, comportamento padrão e portabilidade
- Tutorial de gerenciamento de jobs no Bash (GNU) — Seção oficial do manual Bash sobre foreground, background e jobs
- Artigo sobre nice e renice (Red Hat) — Explicação prática sobre prioridade de processos e ajuste de nice
- Guia de strace para depuração (jvns.ca) — Artigo técnico sobre uso de strace na análise de processos
- Documentação do htop (GitHub) — Repositório oficial com manual e exemplos do monitor interativo htop