Administração de Sistemas

Processos e gerenciamento de jobs: ps, top, kill e signals

• 5 min de leitura

Processos e gerenciamento de jobs: ps, top, kill e signals
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.

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 Z no ps)
  • Ó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

  1. Sempre prefira SIGTERM antes de SIGKILL
  2. Use nohup para processos que devem continuar após logout:
    text $ nohup ./meu_servidor.sh &
  3. 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

  1. Identifique o processo com ps ou top
  2. Comunique com SIGTERM (kill padrão)
  3. Aguarde alguns segundos
  4. Force com SIGKILL se necessário
  5. Verifique se não restaram zumbis

Referências

💬 Comentários
Mais em Administração de Sistemas