O Que e o Systemd
O systemd e o gerente de plantao do seu servidor Linux. Ele e o primeiro programa que liga quando a maquina inicia e fica responsavel por subir, vigiar e religar todos os outros servicos. Sem ele, voce teria que abrir o terminal e iniciar seu programa na mao toda vez que o servidor reiniciasse. Com ele, voce define uma vez como o servico deve rodar e o systemd cuida do resto, dia e noite.
🧠 Analogia: O Gerente de Plantao
Imagine um predio comercial com um gerente que nunca dorme. A funcao dele e simples: manter as luzes acesas, os elevadores funcionando e a recepcao aberta. Se um equipamento desliga, ele liga de novo na hora. Se acaba a energia e volta, ele reabre tudo automaticamente. Esse gerente e o systemd, e os equipamentos sao os seus servicos.
- •Liga os servicos: quando o servidor inicia
- •Vigia os servicos: verifica se continuam de pe
- •Religa os servicos: se algum travar ou cair
- •Anota tudo: guarda os registros (logs) do que aconteceu
💡 Vocabulario: unit, service e PID 1
No mundo do systemd, cada coisa que ele gerencia e uma unit (unidade). O tipo mais comum de unit e o service (servico), que e um programa que roda em segundo plano. O systemd em si e o PID 1: o processo de numero 1, o pai de todos os outros processos da maquina. Quando voce ouvir "criar um service", entenda "ensinar o gerente a cuidar do seu programa".
Criando Seu Primeiro Service File
Para o systemd cuidar do seu programa, voce precisa escrever um arquivo de servico. E um arquivo de texto simples que termina em .service e fica na pasta /etc/systemd/system/. Nele voce explica para o gerente o que rodar, como rodar e quando rodar.
Crie o arquivo com o nano
# Precisa de sudo: a pasta e do sistema
$ sudo nano /etc/systemd/system/meuapp.service
O nome antes do .service e como voce vai chamar o servico depois. Escolha algo curto e sem espacos.
📝 As tres secoes: Unit, Service e Install
Todo service file tem tres blocos. Cada um responde uma pergunta diferente:
[Unit]
Description=Minha aplicacao Node
After=network.target
# ------------------------------
[Service]
ExecStart=/usr/bin/node /home/deploy/app/server.js
WorkingDirectory=/home/deploy/app
User=deploy
Restart=always
# ------------------------------
[Install]
WantedBy=multi-user.target
[Unit]
"Quem sou eu?" Descricao do servico e de quem ele depende para iniciar.
[Service]
"Como me executar?" O comando que liga o programa, a pasta, o usuario e a politica de restart.
[Install]
"Quando me ligar no boot?" Em que momento da inicializacao o servico entra.
⚠️ Erro Comum
Problema: "Coloquei so node server.js no ExecStart e deu erro."
Solucao: O systemd nao sabe onde fica o node. Sempre use o caminho completo do executavel. Descubra com which node (vai mostrar algo como /usr/bin/node) e use esse caminho inteiro no ExecStart.
Controlando o Servico: start, stop, restart, enable
Depois de escrever o arquivo, voce conversa com o systemd usando o comando systemctl. Pense nele como o controle remoto do gerente: liga, desliga, reinicia e agenda os servicos para o boot.
Sempre que mudar o arquivo: recarregue
Toda vez que voce cria ou edita um .service, o systemd precisa reler os arquivos:
$ sudo systemctl daemon-reload
# sem saida = deu certo
Ligar, parar e reiniciar
# Iniciar o servico agora
$ sudo systemctl start meuapp
# Parar o servico
$ sudo systemctl stop meuapp
# Reiniciar (parar e ligar de novo)
$ sudo systemctl restart meuapp
# Ver o estado atual
$ sudo systemctl status meuapp
● meuapp.service - Minha aplicacao Node
Loaded: loaded (/etc/systemd/system/meuapp.service)
Active: active (running) since Tue 2026-06-17 12:30:01
Main PID: 4821 (node)
Note: voce nao precisa digitar o .service no fim. O systemd entende meuapp sozinho.
👁 enable: a diferenca que conta
O start liga o servico agora, mas se o servidor reiniciar ele nao volta. O enable marca o servico para iniciar sozinho no boot. Quase sempre voce quer os dois.
# Iniciar no boot (mas nao agora)
$ sudo systemctl enable meuapp
# Iniciar agora E no boot (o mais usado)
$ sudo systemctl enable --now meuapp
# Desfazer: nao iniciar mais no boot
$ sudo systemctl disable meuapp
✓ O que FAZER
- ✓Rodar
daemon-reloadapos editar o arquivo - ✓Conferir com
statusse ficou ativo - ✓Usar
enable --nowpara producao
✗ O que NAO fazer
- ✗Esquecer o
enablee perder o servico no reboot - ✗Confundir
start(agora) comenable(boot) - ✗Editar o arquivo e nao recarregar o daemon
Lendo os Logs com journalctl
Quando um servico falha, a primeira pergunta e: "o que ele disse antes de cair?". O systemd guarda tudo que cada servico imprime na tela em um diario central. Voce le esse diario com o comando journalctl. E o seu detetive de problemas.
🧠 Analogia: O Diario de Bordo
Pense no journalctl como o diario de bordo de um navio. Tudo que acontece fica anotado com data e hora: quando o servico subiu, quando reiniciou, qual erro apareceu. Quando algo da errado, voce abre o diario na pagina certa e descobre o que aconteceu, sem adivinhar.
Os filtros essenciais: -u, -f e --since
# -u = filtra por um servico (unit)
$ journalctl -u meuapp
jun 17 12:30:01 srv node[4821]: Servidor na porta 3000
jun 17 12:34:18 srv node[4821]: GET /api/users 200
# -f = acompanha ao vivo (follow), como assistir
$ journalctl -u meuapp -f
(novas linhas aparecem em tempo real... Ctrl+C para sair)
# --since = a partir de quando
$ journalctl -u meuapp --since "hoje"
$ journalctl -u meuapp --since "10 min ago"
# Combinando: so erros das ultimas 30 linhas
$ journalctl -u meuapp -n 30 --no-pager
💡 Dica: o trio que resolve 90% dos casos
Quando seu servico nao sobe, rode systemctl status meuapp para ver o resumo, depois journalctl -u meuapp -n 50 para ler as ultimas linhas de erro. Se quiser ver acontecendo na hora, deixe journalctl -u meuapp -f aberto e reinicie o servico em outra aba.
⚠️ Erro Comum
Problema: "O journalctl abre uma tela esquisita e nao sai."
Solucao: Por padrao ele abre no paginador. Use as setas para rolar, q para sair, ou adicione --no-pager para jogar tudo direto na tela. Para ir ao fim do log, aperte Shift+G.
Dependencias: After e Requires
Servicos raramente vivem sozinhos. Sua aplicacao talvez precise do banco de dados ligado antes de subir, ou da rede pronta. O systemd deixa voce declarar essa ordem com duas chaves: After (ordem) e Requires (obrigatoriedade).
network.target sobe
A rede fica pronta. Quase todo servico de internet espera por isso primeiro.
postgresql.service sobe
O banco de dados liga. Sua aplicacao precisa dele de pe para se conectar.
meuapp.service sobe por ultimo
So agora, com rede e banco prontos, sua aplicacao inicia sem erros de conexao.
Declarando a ordem no service file
[Unit]
Description=Minha aplicacao
# Sobe DEPOIS da rede e do banco
After=network.target postgresql.service
# O banco e OBRIGATORIO: se ele cair, eu caio junto
Requires=postgresql.service
After=
Define so a ordem: "me ligue depois deste". Nao obriga o outro a existir. Se o servico citado nao subir, o seu sobe mesmo assim.
Use para: garantir que a rede esteja pronta antes.
Requires=
Cria dependencia forte: "eu nao funciono sem ele". Se o servico exigido falhar, o seu tambem para. Costuma vir junto com After.
Use para: o banco de dados sem o qual o app nao roda.
💡 Dica: After e Requires sao independentes
Requires garante que o outro servico seja iniciado junto, mas nao garante a ordem. Para ter ordem E obrigatoriedade, declare os dois: Requires=db.service mais After=db.service. Esse par e o jeito correto de dizer "preciso do banco, e ligado depois dele".
Restart Automatico: o Superpoder do Systemd
Aqui esta o motivo de usar systemd: ele religa seu servico sozinho quando ele cai. Travou por um bug? Acabou a memoria? O gerente percebe e sobe tudo de novo em segundos, sem voce precisar acordar de madrugada. Isso se configura com duas chaves: Restart e RestartSec.
No bloco [Service]
[Service]
ExecStart=/usr/bin/node /home/deploy/app/server.js
# Sempre religa, nao importa o motivo
Restart=always
# Espera 5 segundos antes de tentar de novo
RestartSec=5
Os valores mais usados de Restart
always
Religa sempre, mesmo se o programa saiu sem erro. O mais comum para apps web.
on-failure
Religa so quando o programa termina com erro (codigo diferente de zero).
no
Nunca religa (e o padrao se voce nao definir nada). Evite em producao.
👁 O que voce vai ver no status apos um crash
● meuapp.service - Minha aplicacao Node
Active: active (running) since Tue 12:40:09
Main PID: 5102 (node)
# No journalctl, o systemd anota o religamento:
12:40:04 systemd: meuapp.service: Main process exited, code=killed
12:40:09 systemd: meuapp.service: Scheduled restart, attempt 1
12:40:09 systemd: Started Minha aplicacao Node.
⚠️ Erro Comum
Problema: "Meu app tem um bug que faz ele cair na hora, e o systemd fica religando em loop sem parar."
Solucao: Sem RestartSec, ele tenta religar instantaneamente e o systemd bloqueia por excesso de tentativas (start-limit). Coloque RestartSec=5 para dar um respiro entre as tentativas, e conserte o bug olhando o journalctl. Restart nao substitui corrigir o erro.
✓ O que FAZER
- ✓Usar
Restart=alwaysem apps web - ✓Definir
RestartSec=5para evitar loop - ✓Olhar o log para entender por que caiu
✗ O que NAO fazer
- ✗Deixar
Restart=noem producao - ✗Usar o restart para mascarar bugs sem corrigir
- ✗Esquecer
daemon-reloadapos mudar as chaves
📚 Resumo do Modulo
Proximo Modulo:
4.4 - Cron Jobs: Tarefas Agendadas (rodar comandos sozinho em horarios definidos)