Em sistemas operacionais Unix-like, processos são a base de toda a execução. Cada programa em execução é um processo, e gerenciá-los é essencial para manter a estabilidade e o desempenho do sistema. Nesta aula, vamos explorar ferramentas e conceitos fundamentais para administrar processos e serviços, com destaque para o systemd, hoje padrão na maioria das distribuições Linux.

Além de entender como processos são criados e encerrados, você aprenderá a utilizar comandos como ps, top, kill e systemctl para controlar o que roda no sistema. Também veremos como consultar logs com journalctl e monitorar recursos com htop e vmstat.

Gerenciamento de processos

Um processo é uma instância de um programa em execução, com seu próprio espaço de endereçamento, estado e recursos associados. O kernel do Linux gerencia a criação, escalonamento e término dos processos. Cada processo possui um PID (Process ID) único e pode ser executado em foreground ou background.

Para listar processos, usamos o comando ps. Com opções como aux (BSD) ou -ef (POSIX), obtemos uma visão detalhada de todos os processos do sistema. O comando top oferece uma visão dinâmica e atualizada dos processos mais ativos, ordenados por uso de CPU. Para encerrar um processo, utilizamos kill com o sinal adequado (ex.: SIGTERM, SIGKILL).

Exemplo prático: visualizar processos de um usuário específico.

# Listar processos do usuário "aluno"
ps -u aluno

Também é possível enviar um processo para background com & ou suspendê-lo com Ctrl+Z e retomá-lo com fg ou bg. O comando jobs lista os jobs da sessão atual.

systemd (visão geral)

systemd é o sistema de init e gerenciador de serviços adotado pela maioria das distribuições Linux modernas. Ele substitui o antigo SysV init e oferece inicialização paralela, dependências entre serviços, e gerenciamento unificado de processos, logs e dispositivos.

As unidades do systemd são arquivos de configuração que descrevem serviços, sockets, montagens, etc. O comando principal é systemctl, que permite iniciar, parar, reiniciar, habilitar e desabilitar serviços. Exemplo de gerenciamento do serviço SSH:

# Verificar status do serviço ssh
systemctl status ssh

# Iniciar o serviço
systemctl start ssh

# Habilitar na inicialização
systemctl enable ssh

Além de serviços, systemd gerencia timers (substitutos do cron), targets (níveis de execução), e muito mais. A análise de dependências pode ser feita com systemctl list-dependencies.

Logs do sistema

Os logs registram eventos do sistema, como erros, avisos e informações de serviços. Com o systemd, o journald coleta logs binários que podem ser consultados com journalctl. Este comando permite filtrar por unidade, prioridade, data, entre outros.

Exemplos de uso do journalctl:

# Ver logs do serviço ssh
journalctl -u ssh

# Logs das últimas 2 horas
journalctl --since "2 hours ago"

# Acompanhar logs em tempo real
journalctl -f

Os logs também podem ser persistidos em arquivos de texto tradicionais em /var/log/, como /var/log/syslog ou /var/log/messages, dependendo da configuração. Ferramentas como tail, less e grep são úteis para análise manual.

Monitoramento básico

Monitorar o sistema envolve acompanhar o uso de CPU, memória, disco, rede e processos. Comandos como top, htop (instalação opcional), vmstat, iostat e netstat fornecem métricas essenciais.

O top já é padrão e mostra processos ordenados por CPU. O htop é mais amigável, com cores e navegação interativa. O vmstat exibe estatísticas de memória, swap, I/O e CPU em intervalos regulares.

Exemplo de monitoramento com vmstat a cada 2 segundos:

vmstat 2

Para monitoramento de rede, netstat -tuln mostra portas abertas e conexões. Em distribuições mais recentes, ss é o substituto recomendado.

Boas práticas

Sempre utilize sinais adequados ao encerrar processos: SIGTERM (15) para término gracioso, SIGKILL (9) apenas se necessário. Evite matar processos do sistema sem entender seu propósito. Para serviços críticos, configure restart automático no systemd com Restart=always no arquivo de unidade. Monitore logs regularmente para detectar problemas precocemente.

Referências

Exercícios

  1. Liste todos os processos em execução no sistema, mostrando PID, nome do comando e uso de memória. Use o comando ps com as opções adequadas.
  2. ✓ Resposta:
    ps aux --sort=-%mem

    Explicação: ps aux lista todos os processos com informações detalhadas. --sort=-%mem ordena por uso de memória decrescente.

  3. Utilizando o systemctl, verifique o status do serviço cron (ou crond). Se estiver ativo, pare-o e depois inicie novamente.
  4. ✓ Resposta:
    systemctl status cron
    sudo systemctl stop cron
    sudo systemctl start cron

    Nota: Em algumas distribuições, o serviço pode se chamar crond. Use sudo se necessário.

  5. Consulte os logs do sistema referentes ao serviço ssh (ou sshd) das últimas 24 horas. Quantas linhas de log foram geradas? (Dica: use journalctl e wc -l)
  6. ✓ Resposta:
    journalctl -u ssh --since "24 hours ago" | wc -l

    O comando conta o número de linhas de log do serviço ssh nas últimas 24 horas.

  7. Execute o comando top e identifique o processo que está consumindo mais CPU. Anote seu PID e nome. Em seguida, encerre-o com kill (apenas se for um processo de usuário seguro).
  8. ✓ Resposta:

    Exemplo de saída do top:

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1234 aluno    20   0  123456  12345   1234 R  85.0   1.2   0:30.45 firefox

    Para encerrar: kill 1234. Cuidado: não mate processos do sistema.

  9. Utilizando vmstat, monitore o sistema a cada 3 segundos por 5 amostras. Explique brevemente o significado das colunas r e si/so.
  10. ✓ Resposta:
    vmstat 3 5

    A coluna r mostra o número de processos na fila de execução (aguardando CPU). Valores altos indicam alta demanda de CPU. As colunas si (swap in) e so (swap out) indicam a quantidade de memória trocada com o disco; valores altos sugerem falta de RAM.