0Pricing
Linux Command Line & Bash Scripting Mastery · Aula

Controle de serviços do systemd e criação de arquivos de unidade

Controle serviços com systemctl e crie arquivos personalizados de unidade e de temporizador para daemons baseados em scripts.

Controle de serviços do systemd e criação de arquivos de unidade é uma aula grátis de Linux Command Line & Bash Scripting Mastery no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Linux Command Line & Bash Scripting Mastery, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Linux Command Line & Bash Scripting Mastery inclui 4 aulas no total.

Introdução ao systemd e ao systemctl

systemd é o sistema de inicialização e o gerenciador de serviços usado pela maioria das distribuições Linux modernas. Ele é responsável por iniciar, parar e gerenciar os serviços do sistema, além de lidar com as sequências de inicialização e o estado do sistema.

A principal ferramenta para interagir com o systemd é o systemctl. Com ela, você pode:

  • Iniciar e parar serviços
  • Habilitar ou desabilitar serviços na inicialização
  • Inspecionar o status e os registros dos serviços
  • Recarregar a configuração sem reiniciar

Todos os serviços gerenciados pelo systemd são definidos por arquivos de unidade, que são arquivos de configuração declarativos armazenados em /etc/systemd/system/ (em todo o sistema) ou ~/.config/systemd/user/ (por usuário).

Comandos essenciais do systemctl

Estes são os comandos do systemctl mais usados no gerenciamento diário de serviços. Cada comando opera sobre um nome de unidade, como nginx.service ou simplesmente nginx.

  • systemctl start <unit> — inicia um serviço imediatamente
  • systemctl stop <unit> — interrompe um serviço em execução
  • systemctl restart <unit> — interrompe e inicia novamente (reinicialização completa)
  • systemctl reload <unit> — envia SIGHUP para recarregar a configuração sem interromper o serviço
  • systemctl enable <unit> — cria links simbólicos para que a unidade seja iniciada na inicialização
  • systemctl disable <unit> — remove esses links simbólicos
  • systemctl status <unit> — mostra o estado, o PID e as linhas de registro recentes
#!/usr/bin/env bash
# Quick reference: inspect and control an nginx service
# (Requires nginx to be installed; run as root or with sudo)

systemctl status nginx
systemctl start nginx
systemctl enable nginx
systemctl reload nginx
systemctl restart nginx
systemctl stop nginx
systemctl disable nginx

Verificando detalhadamente o estado de um serviço

systemctl status fornece um panorama detalhado de uma unidade. Entender essa saída é essencial para diagnosticar problemas rapidamente.

  • Carregada: caminho do arquivo da unidade e indicação de que ela está habilitada na inicialização
  • Ativa: estado atual — active (running), inactive (dead), failed
  • PID principal: identificador do processo principal do serviço
  • CGroup: todos os processos filhos pertencentes ao serviço
  • Linhas de registro: as entradas mais recentes do diário para esta unidade

Também é possível consultar apenas o estado ativo com systemctl is-active e o estado de habilitação com systemctl is-enabled, opções ideais para uso em scripts.

#!/usr/bin/env bash
# Script-friendly service health check
SERVICE="sshd"

if systemctl is-active --quiet "$SERVICE"; then
    echo "$SERVICE is running."
else
    echo "$SERVICE is NOT running. Attempting restart..."
    systemctl restart "$SERVICE"
fi

if systemctl is-enabled --quiet "$SERVICE"; then
    echo "$SERVICE is enabled at boot."
else
    echo "WARNING: $SERVICE is not enabled at boot."
fi

Listando e filtrando unidades

Ao gerenciar muitos serviços, é necessário listar e filtrar unidades de forma eficiente. systemctl list-units mostra todas as unidades carregadas no momento, enquanto list-unit-files mostra todos os arquivos de unidade instalados e seu estado de habilitação.

Opções de filtragem úteis:

  • --type=service — mostra apenas unidades de serviço
  • --state=failed — mostra apenas unidades com falha
  • --state=active — mostra apenas unidades ativas
  • --all — inclui unidades inativas na listagem

Combinar esses filtros com grep permite criar pipelines de inspeção poderosos em scripts de manutenção.

#!/usr/bin/env bash
# List all failed services and report them
echo "=== Failed Services ==="
systemctl list-units --type=service --state=failed --no-legend

echo ""
echo "=== Services Enabled at Boot ==="
systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}'

Anatomia de um arquivo de unidade de serviço do systemd

Um arquivo de unidade de serviço é um arquivo de texto simples no estilo INI, composto por seções. Cada seção controla um aspecto diferente do ciclo de vida da unidade.

  • [Unit] — metadados: descrição e dependências de ordenação (After=, Requires=, Wants=)
  • [Service] — como iniciar e interromper o processo: ExecStart, ExecStop, Restart, User, WorkingDirectory
  • [Install] — quando esta unidade deve ser habilitada: WantedBy=multi-user.target significa que ela será ativada durante a inicialização normal para vários usuários

Depois de colocar ou editar um arquivo de unidade em /etc/systemd/system/, você deve executar systemctl daemon-reload para que o systemd reconheça as alterações.

Escrevendo seu primeiro arquivo de unidade de serviço

Vamos criar um arquivo de unidade de serviço simples para um script personalizado de servidor HTTP em Python. O arquivo de unidade informa ao systemd exatamente como gerenciar esse processo, como se ele fosse qualquer outro serviço do sistema.

Diretivas principais de [Service] usadas aqui:

  • Type=simple — o systemd considera o processo ExecStart o processo principal
  • User=www-data — executa com uma conta que não é de root, por segurança
  • WorkingDirectory — define o diretório de trabalho do processo
  • Restart=on-failure — reinicia automaticamente se o processo terminar com um código diferente de zero
  • RestartSec=5 — aguarda 5 segundos entre as tentativas de reinicialização
#!/usr/bin/env bash
# Create a custom service unit file for a simple HTTP server
# Run as root

cat > /etc/systemd/system/mywebserver.service << 'EOF'
[Unit]
Description=My Custom Python Web Server
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/mysite
ExecStart=/usr/bin/python3 -m http.server 8080
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now mywebserver.service
systemctl status mywebserver.service

Tipos de serviço e ciclo de vida dos processos

A diretiva Type= em [Service] informa ao systemd como acompanhar o momento em que um serviço terminou de iniciar. Escolher o tipo errado é uma fonte comum de problemas de ordenação.

  • Type=simple — padrão; o systemd considera que o serviço foi iniciado assim que ExecStart é executado. Nenhum sinal de prontidão é necessário.
  • Type=forking — o processo ExecStart cria um processo filho e termina; o daemon real é executado como filho. Use PIDFile= para que o systemd possa acompanhá-lo.
  • Type=notify — o processo envia sd_notify(READY=1) quando está realmente pronto. É a opção mais confiável para daemons complexos.
  • Type=oneshot — é executado uma vez e termina; as unidades seguintes aguardam sua conclusão. É ideal para scripts de configuração.
  • Type=idle — semelhante a simple, mas a execução é adiada até que todos os trabalhos ativos terminem.
#!/usr/bin/env bash
# Example: oneshot service for a database migration script
# /etc/systemd/system/db-migrate.service

cat > /etc/systemd/system/db-migrate.service << 'EOF'
[Unit]
Description=Run Database Migrations
After=postgresql.service
Requires=postgresql.service

[Service]
Type=oneshot
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/scripts/migrate.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start db-migrate.service

Variáveis de ambiente e reforço da segurança

Os arquivos de unidade de serviço aceitam várias diretivas para transmitir variáveis de ambiente e aplicar restrições de segurança — ambos são importantes em sistemas de produção.

Diretivas de ambiente:

  • Environment="KEY=value" — define uma única variável diretamente
  • EnvironmentFile=/etc/myapp/env — carrega variáveis de um arquivo (uma KEY=value por linha)

Diretivas comuns de reforço da segurança:

  • NoNewPrivileges=true — impede que o processo obtenha privilégios adicionais por meio de setuid
  • ProtectSystem=strict — monta /usr, /boot e /etc como somente leitura
  • PrivateTmp=true — fornece ao serviço um /tmp próprio e isolado
  • CapabilityBoundingSet= — remove todos os recursos do Linux
#!/usr/bin/env bash
# Hardened service unit with environment file

cat > /etc/systemd/system/secureapp.service << 'EOF'
[Unit]
Description=Secure Application Daemon
After=network.target

[Service]
Type=simple
User=secureapp
Group=secureapp
WorkingDirectory=/opt/secureapp
EnvironmentFile=/etc/secureapp/env
ExecStart=/opt/secureapp/bin/server
Restart=on-failure
RestartSec=10

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
CapabilityBoundingSet=
ReadWritePaths=/var/lib/secureapp /var/log/secureapp

[Install]
WantedBy=multi-user.target
EOF

# Create the environment file separately so secrets stay out of the unit file
install -m 600 -o secureapp /dev/null /etc/secureapp/env
echo 'APP_PORT=9000' >> /etc/secureapp/env
echo 'DB_URL=postgresql://localhost/mydb' >> /etc/secureapp/env

systemctl daemon-reload

Introdução às unidades de temporizador do systemd

Um temporizador do systemd é uma unidade que ativa outra unidade (geralmente um .service) de acordo com um agendamento. Ele substitui as tarefas tradicionais do cron por um mecanismo mais integrado, com registro e controlável.

Cada unidade de temporizador (foo.timer) é associada a uma unidade de serviço com o mesmo nome-base (foo.service), que realiza o trabalho de fato. Você habilita e inicia o temporizador, não o serviço diretamente.

Tipos de temporizador:

  • Temporizadores de tempo real (calendário) — são acionados em horários do relógio usando expressões OnCalendar=, como daily, weekly ou Mon *-*-* 02:00:00
  • Temporizadores monotônicos — são acionados em relação a um evento do sistema usando OnBootSec=, OnActiveSec= ou OnUnitActiveSec=

Escrevendo um arquivo de unidade de temporizador

Vamos criar um par completo de temporizador e serviço que execute um script de backup todos os dias às 02:00. Observe que a seção [Timer] fica em seu próprio arquivo .timer, enquanto o trabalho fica no arquivo .service associado.

Diretivas principais de [Timer]:

  • OnCalendar= — expressão de calendário para o agendamento
  • Persistent=true — se o sistema estava desligado quando o temporizador deveria ter sido acionado, executa-o imediatamente na próxima inicialização
  • RandomizedDelaySec= — adiciona até N segundos de variação aleatória para evitar uma sobrecarga simultânea quando muitos hosts compartilham o mesmo agendamento
  • Unit= — unidade de destino explícita (opcional quando os nomes coincidem)
#!/usr/bin/env bash
# Create a daily backup timer pair
# Run as root

# 1. The service that does the work
cat > /etc/systemd/system/daily-backup.service << 'EOF'
[Unit]
Description=Daily Database Backup
After=network.target postgresql.service

[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup-db.sh
StandardOutput=journal
StandardError=journal
EOF

# 2. The timer that schedules it
cat > /etc/systemd/system/daily-backup.timer << 'EOF'
[Unit]
Description=Run Daily Database Backup at 02:00

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable --now daily-backup.timer

# Verify
systemctl list-timers daily-backup.timer

Inspecionando registros e solucionando problemas em unidades

O systemd direciona toda a saída dos serviços para o diário, que você consulta com journalctl. Isso centraliza os registros de todas as unidades em um único armazenamento pesquisável.

Opções essenciais de journalctl para solucionar problemas de serviços:

  • -u <unit> — filtra pelo nome da unidade
  • -f — acompanha o registro em tempo real (como tail -f)
  • -n 50 — mostra apenas as últimas 50 linhas
  • --since "1 hour ago" — limita por período
  • -p err — mostra apenas erros e mensagens de prioridade superior
  • -b — mostra apenas os registros da inicialização atual

Quando uma unidade não consegue iniciar, a primeira coisa a executar é journalctl -u <unit> -n 30 --no-pager, seguida de systemctl status <unit>, para capturar o contexto recente do erro.

#!/usr/bin/env bash
# Troubleshooting helper: dump unit status and recent logs
# Usage: ./service-debug.sh <unit-name>

UNIT="${1:-nginx.service}"

echo "=============================="
echo "STATUS: $UNIT"
echo "=============================="
systemctl status "$UNIT" --no-pager -l

echo ""
echo "=============================="
echo "RECENT LOGS (last 50 lines): $UNIT"
echo "=============================="
journalctl -u "$UNIT" -n 50 --no-pager

echo ""
echo "=============================="
echo "ERRORS ONLY (current boot)"
echo "=============================="
journalctl -u "$UNIT" -b -p err --no-pager

Teste de conhecimentos: arquivos de unidade do systemd

Teste sua compreensão da configuração de unidades de serviço e de temporizador do systemd.

Recapitulação da lição: controlando serviços do systemd e escrevendo arquivos de unidade

Nesta lição, você explorou em nível profissional os conceitos fundamentais do gerenciamento de serviços do systemd e da criação de arquivos de unidade. Veja um resumo do que foi abordado:

  • Fundamentos do systemctl — start, stop, restart, reload, enable, disable, status, is-active e is-enabled para verificações adequadas ao uso em scripts
  • Listagem e filtragem — list-units e list-unit-files com as opções --type e --state para isolar serviços com falha ou habilitados
  • Anatomia do arquivo de unidade — as três seções [Unit], [Service] e [Install] e suas diretivas principais
  • Tipos de serviço — simple, forking, notify, oneshot e quando usar cada um
  • Ambiente e segurança — EnvironmentFile, NoNewPrivileges, ProtectSystem e PrivateTmp para daemons reforçados
  • Unidades de temporizador — associação de arquivos .timer e .service, expressões OnCalendar e comportamento de recuperação de Persistent
  • Journalctl — filtragem por unidade, horário, inicialização e prioridade para diagnosticar falhas com eficiência

Com essas habilidades, você pode gerenciar qualquer serviço do sistema, agendar tarefas recorrentes de forma confiável e criar arquivos de unidade prontos para produção para seus próprios daemons.

Perguntas Frequentes

A aula “Controle de serviços do systemd e criação de arquivos de unidade” é grátis?

Sim — o texto completo de “Controle de serviços do systemd e criação de arquivos de unidade” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Linux Command Line & Bash Scripting Mastery, atualize para CoddyKit PRO. O curso de Linux Command Line & Bash Scripting Mastery inclui 4 aulas no total.

O que vou aprender em “Controle de serviços do systemd e criação de arquivos de unidade”?

Controle serviços com systemctl e crie arquivos personalizados de unidade e de temporizador para daemons baseados em scripts. Você pratica Linux Command Line & Bash Scripting Mastery com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Linux Command Line & Bash Scripting Mastery?

Nenhuma experiência prévia é necessária. Linux Command Line & Bash Scripting Mastery no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Controle de serviços do systemd e criação de arquivos de unidade”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Linux Command Line & Bash Scripting Mastery?

Sim. Cada aula de Linux Command Line & Bash Scripting Mastery inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Automação do provisionamento de usuários e grupos
  2. Controle de serviços do systemd e criação de arquivos de unidade
  3. Automação de discos, sistemas de arquivos e montagem
  4. Criação de scripts de verificação e alerta da integridade do sistema
← Voltar para Linux Command Line & Bash Scripting Mastery