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 imediatamentesystemctl stop <unit>— interrompe um serviço em execuçãosystemctl restart <unit>— interrompe e inicia novamente (reinicialização completa)systemctl reload <unit>— envia SIGHUP para recarregar a configuração sem interromper o serviçosystemctl enable <unit>— cria links simbólicos para que a unidade seja iniciada na inicializaçãosystemctl disable <unit>— remove esses links simbólicossystemctl 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 nginxVerificando 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."
fiListando 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.targetsignifica 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 processoExecStarto processo principalUser=www-data— executa com uma conta que não é de root, por segurançaWorkingDirectory— define o diretório de trabalho do processoRestart=on-failure— reinicia automaticamente se o processo terminar com um código diferente de zeroRestartSec=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.serviceTipos 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 queExecStarté executado. Nenhum sinal de prontidão é necessário.Type=forking— o processoExecStartcria um processo filho e termina; o daemon real é executado como filho. UsePIDFile=para que o systemd possa acompanhá-lo.Type=notify— o processo enviasd_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.serviceVariá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 diretamenteEnvironmentFile=/etc/myapp/env— carrega variáveis de um arquivo (umaKEY=valuepor linha)
Diretivas comuns de reforço da segurança:
NoNewPrivileges=true— impede que o processo obtenha privilégios adicionais por meio de setuidProtectSystem=strict— monta/usr,/boote/etccomo somente leituraPrivateTmp=true— fornece ao serviço um/tmppróprio e isoladoCapabilityBoundingSet=— 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-reloadIntroduçã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=, comodaily,weeklyouMon *-*-* 02:00:00 - Temporizadores monotônicos — são acionados em relação a um evento do sistema usando
OnBootSec=,OnActiveSec=ouOnUnitActiveSec=
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 agendamentoPersistent=true— se o sistema estava desligado quando o temporizador deveria ter sido acionado, executa-o imediatamente na próxima inicializaçãoRandomizedDelaySec=— adiciona até N segundos de variação aleatória para evitar uma sobrecarga simultânea quando muitos hosts compartilham o mesmo agendamentoUnit=— 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.timerInspecionando 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 (comotail -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-pagerTeste 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-unitselist-unit-filescom as opções--typee--statepara 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,oneshote quando usar cada um - Ambiente e segurança —
EnvironmentFile,NoNewPrivileges,ProtectSystemePrivateTmppara daemons reforçados - Unidades de temporizador — associação de arquivos
.timere.service, expressõesOnCalendare comportamento de recuperação dePersistent - 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
- Automação do provisionamento de usuários e grupos
- Controle de serviços do systemd e criação de arquivos de unidade
- Automação de discos, sistemas de arquivos e montagem
- Criação de scripts de verificação e alerta da integridade do sistema