Rodar um app com & ou nohup funciona bem até o servidor reiniciar, o processo cair ou você querer achar seus logs — aí tudo desmorona. systemd é a resposta padrão: inicia seu app no boot, reinicia-o se ele morre e captura seus logs. Transformar um script ou binário em um serviço gerenciado é um arquivo pequeno.
1. Escreva um arquivo unit
Crie /etc/systemd/system/myapp.service:
[Unit]
Description=My application
After=network.target
[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Ajuste ExecStart, WorkingDirectory e User ao seu app. Restart=always é o que o mantém vivo.
2. Crie um usuário dedicado (recomendado)
sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp
Rodar como usuário sem privilégios de root limita o dano se o app um dia for comprometido.
3. Ative-o e inicie-o
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
enable faz iniciar no boot; --now inicia imediatamente.
4. Verifique status e logs
sudo systemctl status myapp
journalctl -u myapp -f # acompanhar os logs ao vivo
Comandos do dia a dia
sudo systemctl restart myapp # reiniciar após uma mudança
sudo systemctl stop myapp # pará-lo
sudo systemctl disable myapp # parar de iniciar no boot
Avisos honestos
- Rode
daemon-reloadapós editar um arquivo unit, ou o systemd usa a versão antiga. - Cuidado com loops de queda. Se o app falha instantaneamente,
Restart=alwaystenta para sempre —RestartSec=5espaça as tentativas; corrija o erro de raiz pelos logs. - Prefira um
User=sem privilégios de root para que um app comprometido não seja dono do servidor inteiro.
Próximos passos
Um serviço systemd é como você mantém qualquer coisa rodando 24/7 — por exemplo um agente de IA que roda o tempo todo ou o relay por trás de um servidor RustDesk auto-hospedado. Se seu app for containerizado, o --restart unless-stopped do Docker cumpre o mesmo papel — veja como instalar o Docker.
Comentários
Nenhum comentário ainda. Seja o primeiro.