Poupe 15% em todos os serviços de alojamento

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código: Skills Começar a trabalhar
Secções
Administração Linux Servidores Virtuais

Como usar systemd para iniciar um serviço Linux na inicialização

Garantir que os serviços críticos iniciem automaticamente quando o seu servidor reinicia é uma das responsabilidades mais fundamentais de qualquer administrador de sistemas Linux. Quer esteja a executar uma aplicação web, um motor de base de dados ou um daemon personalizado num ambiente de VPS Hosting, um reinício inesperado nunca deve significar tempo de inatividade prolongado. Com systemd — o moderno sistema init que alimenta a maioria das distribuições Linux atuais — pode definir precisamente como, quando e como qual utilizador os seus serviços são iniciados, tudo através de um ficheiro de unidade limpo e declarativo.

Este guia abrangente orienta-o em cada passo: compreender o que é systemd, criar um ficheiro de unidade de serviço pronto para produção, verificar permissões, testar o seu executável e gerir o ciclo de vida do serviço. No final, a sua aplicação personalizada sobreviverá a cada reinício automaticamente.

O que é systemd e por que é importante?

systemd é um sistema init e gerenciador de serviços que substituiu alternativas mais antigas, como SysVinit e Upstart, na maioria das principais distribuições Linux, incluindo Ubuntu, Debian, CentOS, Rocky Linux, AlmaLinux e Fedora. Em vez de executar uma cadeia sequencial de scripts shell na inicialização, systemd paraleliza a inicialização de serviços, resolve a ordenação de dependências e gerencia todo o ciclo de vida dos processos do sistema a partir de uma única interface unificada.

Principais vantagens do systemd para ambientes de servidor

RecursoBenefício
Inicialização paralela de serviçosTempos de inicialização mais rápidos em servidores com múltiplos serviços
Gerenciamento de dependênciasOs serviços são iniciados apenas após seus pré-requisitos estarem prontos
Políticas de reinicialização automáticaServiços travados se recuperam sem intervenção manual
Registro centralizado via journaldToda a saída de serviço é capturada em um journal consultável
Controle de recursos baseado em cgroupLimites de CPU e memória aplicados por serviço
Ativação de socket e dispositivoOs serviços são iniciados sob demanda, não incondicionalmente

Para qualquer pessoa que gerencia aplicações em Servidores Dedicados ou instâncias VPS, essas capacidades se traduzem diretamente em maior tempo de atividade e comportamento mais previsível sob carga.

Compreender Ficheiros de Unidade systemd

Tudo o que systemd gere é representado por um ficheiro de unidade — um ficheiro de configuração em texto simples dividido em secções. Um ficheiro de unidade .service diz ao systemd:

  • O que é o serviço (metadados, descrição, dependências)
  • Como executá-lo (caminho do executável, diretório de trabalho, contexto do utilizador)
  • Quando iniciá-lo (alvo de arranque, ordenação relativa a outras unidades)
  • O que fazer se falhar (política de reinício, atraso de reinício)

Os ficheiros de unidade de serviço para serviços em todo o sistema residem em /etc/systemd/system/. Os ficheiros colocados aqui têm precedência sobre as unidades fornecidas pelo fornecedor em /lib/systemd/system/ e persistem através de atualizações de pacotes.

Passo a Passo: Criando uma Unidade de Serviço systemd

O seguinte passo a passo usa uma aplicação fictícia chamada myapp. Substitua cada instância de myapp, myuser e /usr/bin/myapp com valores apropriados para seu próprio ambiente.

Passo 1: Preparar o Diretório de Trabalho

Antes de escrever o arquivo de unidade, decida de onde sua aplicação será executada. Um diretório de trabalho dedicado mantém arquivos de configuração, logs e dados de tempo de execução organizados e torna o gerenciamento de permissões direto.

Crie o diretório se ele ainda não existir:

sudo mkdir -p /opt/myapp

> Por que /opt/ em vez de /etc/systemd/?

> A árvore /etc/systemd/ é reservada para a própria configuração do systemd. Colocar dados de aplicação lá é não-padrão e pode causar confusão. Use /opt/myapp, /srv/myapp ou /var/lib/myapp dependendo da categoria do Padrão de Hierarquia do Sistema de Arquivos que melhor se adequa à sua carga de trabalho.

Atribua a propriedade ao usuário que executará o serviço:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myuser
sudo chown -R myuser:myuser /opt/myapp

Usar uma conta de sistema dedicada (sem shell de login, sem diretório inicial) é uma prática recomendada de segurança. Isso limita o raio de explosão se a aplicação for comprometida.

Verifique o resultado:

ls -ld /opt/myapp
# Expected output: drwxr-xr-x 2 myuser myuser 4096 Jan 1 00:00 /opt/myapp

Passo 2: Criar o Arquivo de Unidade de Serviço

Abra um novo arquivo de unidade com seu editor preferido:

sudo nano /etc/systemd/system/myapp.service

Cole o seguinte conteúdo, ajustando os valores para corresponder à sua aplicação:

[Unit]
Description=My Custom Application
Documentation=https://example.com/docs
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/myapp --config /opt/myapp/myapp.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
User=myuser
Group=myuser
WorkingDirectory=/opt/myapp
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Salve o arquivo com Ctrl+O e saia com Ctrl+X.

Passo 3: Entendendo Cada Diretiva

Seção [Unit]

DiretivaPropósito
DescriptionNome legível por humanos mostrado na saída systemctl status
DocumentationReferência de URL ou página de manual para o serviço
AfterGarante que o serviço inicie *depois* que a unidade listada estiver ativa
WantsDependência suave — systemd *tentará* iniciar a unidade listada, mas não falhará se ela estiver indisponível

> network-online.target vs network.target: Use network-online.target (combinado com Wants=network-online.target) para serviços que genuinamente precisam de uma interface de rede totalmente configurada — por exemplo, uma aplicação que se conecta a um banco de dados remoto ou a uma API externa na inicialização. network.target apenas garante que o subsistema de rede foi *iniciado*, não que as interfaces estão ativas e os endereços foram atribuídos.

Seção [Service]

DiretivaPropósito
Type=simpleO processo iniciado por ExecStart é o processo principal (padrão para a maioria das aplicações)
ExecStartCaminho completo para o binário e quaisquer argumentos. Sempre use caminhos absolutos.
ExecReloadComando para recarregar a configuração sem uma reinicialização completa (opcional, mas recomendado)
Restart=on-failureReinicie o serviço apenas quando ele sair com um código diferente de zero ou for eliminado por um sinal. Use always se quiser reinicializações mesmo em saídas limpas.
RestartSecSegundos a aguardar antes de tentar uma reinicialização
User / GroupExecute o processo como este usuário/grupo em vez de root
WorkingDirectoryDefina o diretório atual antes de executar ExecStart
StandardOutput / StandardErrorRoteie stdout/stderr para o journal do systemd
SyslogIdentifierTag usada para filtrar entradas de journal para este serviço
NoNewPrivilegesImpede que o processo ganhe privilégios adicionais via binários setuid
ProtectSystem=strictMonta /usr, /boot e /etc como somente leitura para o serviço
ProtectHomeTorna /home, /root e /run/user inacessíveis
PrivateTmpDá ao serviço seu próprio namespace privado /tmp

Seção [Install]

DiretivaPropósito
WantedBy=multi-user.targetAtiva o serviço quando o sistema atinge o nível de execução padrão multi-usuário (não-gráfico). Este é o alvo correto para praticamente todos os daemons de servidor.

Passo 4: Verificar Permissões de Arquivo e Diretório

Antes de recarregar o systemd, confirme que o usuário do serviço pode realmente acessar tudo o que precisa:

# Check working directory ownership and permissions
ls -ld /opt/myapp

# Confirm the executable exists and is executable
ls -l /usr/bin/myapp

# Verify the config file is readable by myuser
sudo -u myuser cat /opt/myapp/myapp.conf

Se qualquer uma dessas verificações falhar, corrija as permissões antes de prosseguir:

# Make the binary executable
sudo chmod +x /usr/bin/myapp

# Grant read access to the config file
sudo chmod 640 /opt/myapp/myapp.conf
sudo chown myuser:myuser /opt/myapp/myapp.conf

Passo 5: Testar o Executável Manualmente

Sempre verifique que sua aplicação é executada corretamente *antes* de entregar o controle ao systemd. Isso isola bugs de aplicação de problemas de configuração do systemd:

sudo -u myuser /usr/bin/myapp --config /opt/myapp/myapp.conf

Se a aplicação iniciar sem erros, pressione Ctrl+C para pará-la e prossiga. Se falhar, solucione a própria aplicação — verifique se todas as dependências estão instaladas, as variáveis de ambiente estão definidas e as portas necessárias estão disponíveis.

Passo 6: Recarregar systemd e Ativar o Serviço

Após salvar o arquivo de unidade, instrua o systemd a relê sua configuração:

sudo systemctl daemon-reload

Ative o serviço para que ele inicie automaticamente em cada inicialização subsequente:

sudo systemctl enable myapp.service

Este comando cria um symlink no diretório .wants apropriado, vinculando seu arquivo de unidade à sequência de inicialização multi-user.target. Você deve ver uma saída semelhante a:

Created symlink /etc/systemd/system/multi-user.target.wants/myapp.service → /etc/systemd/system/myapp.service.

Inicie o serviço imediatamente sem reinicializar:

sudo systemctl start myapp.service

Passo 7: Verificar se o Serviço Está Executando

Verifique o status atual do serviço:

sudo systemctl status myapp.service

Um serviço saudável produz uma saída como esta:

● myapp.service - My Custom Application
     Loaded: loaded (/etc/systemd/system/myapp.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2025-01-01 12:00:00 UTC; 5s ago
   Main PID: 12345 (myapp)
      Tasks: 4 (limit: 4915)
     Memory: 12.3M
        CPU: 45ms
     CGroup: /system.slice/myapp.service
             └─12345 /usr/bin/myapp --config /opt/myapp/myapp.conf

Campos-chave a verificar:

  • Loaded — confirma que o arquivo de unidade foi analisado com sucesso e mostra se está enabled ou disabled para inicialização
  • Active: active (running) — o serviço está em execução no momento
  • Main PID — o ID do processo de sua aplicação

Passo 8: Monitorar Logs com journalctl

systemd roteia toda a saída do serviço para o journal, um armazenamento de log estruturado e consultável. Use journalctl para inspecioná-lo:

# View all logs for myapp (most recent last)
journalctl -u myapp.service

# Follow live log output (like tail -f)
journalctl -u myapp.service -f

# Show only logs since the last boot
journalctl -u myapp.service -b

# Show the last 50 lines
journalctl -u myapp.service -n 50

# Show logs since a specific time
journalctl -u myapp.service --since "2025-01-01 12:00:00"

Se seu serviço falhar ao iniciar, o journal quase sempre contém a mensagem de erro exata explicando o motivo. Este é o primeiro lugar a procurar antes de fazer qualquer alteração.

Passo 9: Testar o Comportamento de Inicialização

Para confirmar que o serviço sobrevive a uma reinicialização sem inspecionar manualmente a sequência de inicialização, você pode simulá-la:

# Reboot the server (only if safe to do so)
sudo reboot

Após o servidor voltar online, verifique o status do serviço novamente:

sudo systemctl status myapp.service

Se mostrar active (running), seu serviço está corretamente configurado para inicialização automática.

Gerenciar o Ciclo de Vida do Serviço

Depois que seu serviço estiver em execução, você usará os seguintes comandos regularmente:

Comandos systemctl Comuns

# Start the service
sudo systemctl start myapp.service

# Stop the service gracefully
sudo systemctl stop myapp.service

# Restart the service (stop + start)
sudo systemctl restart myapp.service

# Reload configuration without restarting (if ExecReload is defined)
sudo systemctl reload myapp.service

# Enable automatic startup at boot
sudo systemctl enable myapp.service

# Disable automatic startup at boot
sudo systemctl disable myapp.service

# Check whether the service is enabled
sudo systemctl is-enabled myapp.service

# Check whether the service is currently active
sudo systemctl is-active myapp.service

# View the full unit file as systemd interprets it
sudo systemctl cat myapp.service

# Edit the unit file and reload in one step
sudo systemctl edit --full myapp.service

Resolução de Problemas Comuns

Falha ao iniciar o serviço: "No such file or directory"

Isto geralmente significa que ExecStart aponta para um binário inexistente ou WorkingDirectory não existe. Verifique ambos os caminhos:

which myapp
ls -l /opt/myapp

Serviço inicia mas sai imediatamente

Verifique o journal para a saída de erro da própria aplicação:

journalctl -u myapp.service -n 100 --no-pager

Também verifique se Type=simple está correto para a sua aplicação. Se o seu binário se bifurca para o background, use Type=forking em vez disso.

Erros de "Permission denied"

O utilizador do serviço não tem acesso a um ficheiro ou diretório necessário. Use ls -l para auditar permissões e sudo -u myuser para testar o acesso interativamente.

Porta já em uso

Outro processo está vinculado à porta que a sua aplicação necessita. Identifique-o com:

sudo ss -tlnp | grep :<port>

Serviço reinicia em loop

Se Restart=on-failure causar loops de reinício rápido, o systemd eventualmente limitará as reinicializações. Verifique StartLimitIntervalSec e StartLimitBurst na secção [Unit] para ajustar este comportamento, e investigue sempre a causa raiz no journal.

Padrões systemd Avançados para Servidores de Produção

Variáveis de Ambiente e Ficheiros de Ambiente

Nunca codifique segredos em ficheiros de unidade. Use um ficheiro de ambiente:

[Service]
EnvironmentFile=/etc/myapp/myapp.env
ExecStart=/usr/bin/myapp

Crie /etc/myapp/myapp.env com chmod 600 e chown root:myuser para restringir o acesso:

DATABASE_URL=postgresql://user:password@localhost/mydb
API_KEY=supersecretkey

Dependências de Serviço e Ordenação

Se a sua aplicação depende de um serviço de base de dados (por exemplo, PostgreSQL ou MySQL), declare essa dependência explicitamente:

[Unit]
After=network-online.target postgresql.service
Requires=postgresql.service

Requires é uma dependência forte — se PostgreSQL falhar ao iniciar, systemd não tentará iniciar o seu serviço.

Integração de Watchdog

Para serviços críticos, ative o watchdog integrado do systemd para detetar processos travados:

[Service]
WatchdogSec=30s
Restart=on-watchdog

A sua aplicação deve chamar sd_notify(0, "WATCHDOG=1") periodicamente para repor o temporizador do watchdog. Se falhar ao fazê-lo dentro de WatchdogSec, systemd mata e reinicia o serviço.

Escolher o Ambiente de Hosting Correto

Os padrões de configuração systemd descritos neste guia aplicam-se igualmente em todos os tipos de servidores Linux, mas a sua escolha de infraestrutura de hosting afeta o controlo que tem sobre o sistema init e a gestão de serviços.

  • VPS Hosting — Acesso root completo, controlo systemd total, ideal para implementações de aplicações personalizadas. Os planos VPS da AlexHost funcionam em virtualização KVM, dando-lhe um ambiente de kernel genuinamente isolado.
  • Servidores Dedicados — Desempenho máximo e isolamento para serviços que consomem muitos recursos. Acesso completo ao hardware sem vizinhos barulhentos.
  • VPS com cPanel — Combina acesso systemd ao nível root com um painel de controlo gráfico para equipas que gerem tanto serviços do sistema como hosting web a partir de uma única interface.
  • Hosting Web Partilhado — Adequado para aplicações web padrão que não requerem serviços de sistema personalizados. Sem acesso root, mas zero sobrecarga de gestão de servidor.

Se está a implementar um daemon personalizado, microserviço ou qualquer aplicação que precise de sobreviver a reinicializações automaticamente, um VPS ou servidor dedicado com acesso root completo é a escolha apropriada.

Referência Rápida: Lista de Verificação Completa de Serviço systemd

Antes de considerar seu serviço pronto para produção, verifique cada item nesta lista:

  • [ ] Arquivo de unidade salvo em /etc/systemd/system/myapp.service
  • [ ] ExecStart usa um caminho absoluto para um binário válido e executável
  • [ ] WorkingDirectory existe e é propriedade do usuário do serviço
  • [ ] O serviço é executado como uma conta de sistema dedicada não-root
  • [ ] sudo systemctl daemon-reload executado após qualquer alteração de arquivo de unidade
  • [ ] sudo systemctl enable myapp.service confirma que o symlink foi criado
  • [ ] sudo systemctl status myapp.service mostra active (running)
  • [ ] journalctl -u myapp.service não mostra erros
  • [ ] Servidor reiniciado e serviço confirmado em execução após inicialização
  • [ ] Diretivas de endurecimento de segurança (NoNewPrivileges, ProtectSystem, PrivateTmp) aplicadas

Conclusão

systemd é a camada definitiva de gerenciamento de serviços para servidores Linux modernos. Ao criar um arquivo de unidade .service bem estruturado, você ganha inicialização automática na inicialização, políticas de reinicialização inteligentes, registro centralizado e controles de segurança refinados — tudo sem escrever uma única linha de script shell.

O processo é direto: prepare um diretório de trabalho dedicado e usuário do sistema, escreva o arquivo de unidade com as seções [Unit], [Service] e [Install] corretas, recarregue o daemon systemd, ative e inicie o serviço, depois verifique com systemctl status e journalctl. Aplique as diretivas de endurecimento de segurança discutidas acima, e seu serviço será resiliente e adequadamente isolado do resto do sistema.

Quer você esteja implantando uma API Node.js, um worker Python, um binário Go ou qualquer outro aplicativo personalizado em um plano VPS Hosting ou Servidores Dedicados da AlexHost, este fluxo de trabalho systemd garante que seu serviço esteja sempre funcionando quando seus usuários precisarem — mesmo após uma reinicialização inesperada.