Criando Serviços no Linux com systemd
O systemd é o sistema de init padrão na grande maioria das distribuições Linux modernas — Debian, Ubuntu, Fedora, Arch, RHEL e derivados. Ele é responsável por inicializar o sistema, gerenciar processos e, o que mais interessa aqui, controlar serviços que precisam rodar em background.
Neste artigo você vai aprender a instalar um binário corretamente, criar um usuário dedicado sem privilégios desnecessários, definir um arquivo .service e gerenciar o ciclo de vida do serviço com systemctl e journalctl.
Preparando o ambiente
O cenário mais comum ao instalar um serviço de terceiros é: baixar o binário, colocá-lo no lugar certo e dar as permissões adequadas. A convenção no Linux é usar /opt para softwares que não pertencem ao gerenciador de pacotes da distro.
Baixe o binário em /tmp — é um diretório temporário, ideal para downloads que ainda serão processados:
wget -O /tmp/meu-servico https://exemplo.com/releases/meu-servico-linux-amd64
ou com curl:
curl -L -o /tmp/meu-servico https://exemplo.com/releases/meu-servico-linux-amd64
Crie o diretório em /opt e mova o binário para lá:
sudo mkdir -p /opt/meu-servico
sudo mv /tmp/meu-servico /opt/meu-servico/meu-servico
Torne o binário executável:
sudo chmod +x /opt/meu-servico/meu-servico
Criando um usuário de sistema
Rodar um serviço como root é um erro clássico. Se o processo for comprometido, o atacante tem controle total da máquina. O princípio do menor privilégio diz: dê ao processo apenas o acesso que ele precisa para funcionar.
Para isso, crie um usuário de sistema dedicado ao serviço. Esse usuário não terá home directory, não poderá fazer login interativo e não aparecerá como um usuário comum no sistema:
sudo useradd \
--system \
--no-create-home \
--shell /usr/sbin/nologin \
meu-servico
--system: cria um usuário de sistema com UID baixo (abaixo de 1000), sem grupo primário separado por padrão--no-create-home: não cria/home/meu-servico--shell /usr/sbin/nologin: impede qualquer tentativa de login interativo com esse usuário
Agora transfira a propriedade dos arquivos do serviço para esse usuário:
sudo chown -R meu-servico:meu-servico /opt/meu-servico
Criando o arquivo .service
Os arquivos de unit do systemd ficam em /etc/systemd/system/. Crie o arquivo do seu serviço:
sudo nano /etc/systemd/system/meu-servico.service
Conteúdo do arquivo:
[Unit]
Description=Meu Servico de Exemplo
Documentation=https://exemplo.com/docs
After=network.target
[Service]
Type=simple
User=meu-servico
Group=meu-servico
ExecStart=/opt/meu-servico/meu-servico
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Entendendo as diretivas principais:
[Unit]
After=network.target: garante que o serviço só inicia após a rede estar disponível
[Service]
Type=simple: o processo iniciado peloExecStarté o processo principal (padrão para a maioria dos casos)UsereGroup: define sob qual usuário e grupo o processo roda — aqui entra o usuário que criamosExecStart: caminho absoluto para o binário e seus argumentosRestart=on-failure: reinicia automaticamente se o processo encerrar com código de erroRestartSec=5s: aguarda 5 segundos antes de tentar reiniciar
[Install]
WantedBy=multi-user.target: o serviço é iniciado no runlevel multiusuário (equivalente ao modo normal de operação)
Gerenciando o serviço
Após criar ou modificar qualquer arquivo .service, você precisa informar ao systemd que houve mudanças:
sudo systemctl daemon-reload
Habilite o serviço para iniciar automaticamente no boot e inicie-o imediatamente:
sudo systemctl enable --now meu-servico
Os comandos do dia a dia:
# Iniciar
sudo systemctl start meu-servico
# Parar
sudo systemctl stop meu-servico
# Reiniciar
sudo systemctl restart meu-servico
# Ver status atual
sudo systemctl status meu-servico
O status mostra se o serviço está ativo, o PID, quando foi iniciado e as últimas linhas de log — útil para diagnóstico rápido.
Para verificar se o serviço está habilitado para iniciar no boot:
systemctl is-enabled meu-servico
Consultando logs com journalctl
O systemd centraliza todos os logs no journald. Para ver os logs do seu serviço:
sudo journalctl -u meu-servico
Seguir os logs em tempo real (equivalente ao tail -f):
sudo journalctl -u meu-servico -f
Ver apenas logs da última hora:
sudo journalctl -u meu-servico --since "1 hour ago"
Filtrar por intervalo de tempo:
sudo journalctl -u meu-servico --since "2026-03-28 10:00:00" --until "2026-03-28 11:00:00"
Ver apenas as últimas N linhas:
sudo journalctl -u meu-servico -n 50
Os logs do journald persistem entre reinicializações por padrão nas distros modernas, então você consegue investigar o que aconteceu antes de um crash.
Recapitulando
O fluxo completo para subir um serviço de forma segura no Linux:
- Baixar o binário em
/tmp - Mover para
/opt/nome-do-servico/e tornar executável - Criar usuário de sistema com
useradd --system --no-create-home --shell /usr/sbin/nologin - Transferir propriedade com
chown - Criar o arquivo
.serviceem/etc/systemd/system/ - Executar
systemctl daemon-reload - Habilitar e iniciar com
systemctl enable --now - Monitorar com
journalctl -u nome -f
Seguindo esse fluxo, o serviço roda com o mínimo de privilégios necessários, reinicia sozinho em caso de falha e seus logs ficam centralizados no journal do sistema.
Escrito por Gabriel Castro - 28/03/2026