Lab 8.5 - Exercício Extra: Criar 3 Novos Serviços Wiki.js e Testar Diferentes Formas de Pará-los
Objetivos
Ao final deste lab, você será capaz de:
- Dominar a criação de instâncias adicionais a partir de um template systemd (
wikijs@.service) - Comparar vários comandos de "parada" e identificar quais funcionam corretamente (e por quê)
- Utilizar templates systemd para gerenciar múltiplas instâncias de uma mesma aplicação
- Identificar e parar processos Node.js de diferentes maneiras
- Entender as diferenças entre
stop,disable,kille outros métodos de parada
Pré-requisitos
- Ubuntu 24.04 instalado
- Acesso sudo/root
- Wiki.js já instalado (pelo menos uma instância)
- Conhecimento básico de systemd e MariaDB
- Terminal aberto
Visão Geral
Neste lab, você irá criar 3 novas instâncias do Wiki.js (stage, qa, demo) usando um template systemd. Em seguida, irá testar diferentes métodos para parar esses serviços e entender por que alguns funcionam e outros não.
Arquitetura das instâncias:
| Ambiente | Conta Linux | Pasta | Porta | Base MariaDB |
|---|---|---|---|---|
| stage | wikijs_stage | /var/www/stage.site1 | 3003 | wikidb_stage |
| qa | wikijs_qa | /var/www/qa.site1 | 3004 | wikidb_qa |
| demo | wikijs_demo | /var/www/demo.site1 | 3005 | wikidb_demo |
Parte 1: Preparação do Template systemd
Passo 1: Criar o Template systemd
Se você ainda não tem um template, crie-o:
sudo nano /etc/systemd/system/wikijs@.service
Conteúdo do template:
[Unit]
Description=Wiki.js Instance %i
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always
User=wikijs_%i
Environment=NODE_ENV=production
WorkingDirectory=/var/www/%i.site1
[Install]
WantedBy=multi-user.target
Explicação:
%ié substituído pela instância (stage, qa, demo)wikijs_%ivirawikijs_stage,wikijs_qa,wikijs_demo/var/www/%i.site1vira/var/www/stage.site1, etc.
Passo 2: Recarregar o systemd
sudo systemctl daemon-reload
Parte 2: Criação das Três Novas Instâncias
Passo 1: Criar os Usuários do Sistema
# Criar os usuários para cada instância
sudo adduser --system --group wikijs_stage
sudo adduser --system --group wikijs_qa
sudo adduser --system --group wikijs_demo
# Permitir login com bash
sudo usermod -s /bin/bash wikijs_stage
sudo usermod -s /bin/bash wikijs_qa
sudo usermod -s /bin/bash wikijs_demo
Passo 2: Criar os Diretórios
# Criar os diretórios para cada instância
sudo mkdir -p /var/www/stage.site1
sudo mkdir -p /var/www/qa.site1
sudo mkdir -p /var/www/demo.site1
# Definir os proprietários
sudo chown -R wikijs_stage:wikijs_stage /var/www/stage.site1
sudo chown -R wikijs_qa:wikijs_qa /var/www/qa.site1
sudo chown -R wikijs_demo:wikijs_demo /var/www/demo.site1
Passo 3: Criar os Bancos de Dados MariaDB
# Conectar ao MariaDB
sudo mysql -u root -p
No shell do MariaDB:
-- Criar os bancos de dados
CREATE DATABASE wikidb_stage;
CREATE DATABASE wikidb_qa;
CREATE DATABASE wikidb_demo;
-- Criar os usuários
CREATE USER 'wikidb_stage_user'@'localhost' IDENTIFIED BY 'password_stage';
CREATE USER 'wikidb_qa_user'@'localhost' IDENTIFIED BY 'password_qa';
CREATE USER 'wikidb_demo_user'@'localhost' IDENTIFIED BY 'password_demo';
-- Conceder privilégios
GRANT ALL PRIVILEGES ON wikidb_stage.* TO 'wikidb_stage_user'@'localhost';
GRANT ALL PRIVILEGES ON wikidb_qa.* TO 'wikidb_qa_user'@'localhost';
GRANT ALL PRIVILEGES ON wikidb_demo.* TO 'wikidb_demo_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Passo 4: Baixar e Instalar o Wiki.js para Cada Instância
Para Stage (porta 3003)
# Conectar como wikijs_stage
sudo su - wikijs_stage
# Ir para o diretório
cd /var/www/stage.site1
# Baixar o Wiki.js
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
# Extrair
tar xzf wiki-js.tar.gz
# Remover o arquivo compactado
rm wiki-js.tar.gz
# Copiar o arquivo de configuração
cp config.sample.yml config.yml
# Editar a configuração
nano config.yml
Configuração para stage:
port: 3003
bindIP: 0.0.0.0
db:
type: mariadb
host: localhost
port: 3306
user: wikidb_stage_user
pass: password_stage
db: wikidb_stage
ssl: false
Salve e saia. Depois:
exit
Para QA (porta 3004)
sudo su - wikijs_qa
cd /var/www/qa.site1
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
tar xzf wiki-js.tar.gz
rm wiki-js.tar.gz
cp config.sample.yml config.yml
nano config.yml
Configuração para qa:
port: 3004
bindIP: 0.0.0.0
db:
type: mariadb
host: localhost
port: 3306
user: wikidb_qa_user
pass: password_qa
db: wikidb_qa
ssl: false
Salve e saia. Depois:
exit
Para Demo (porta 3005)
sudo su - wikijs_demo
cd /var/www/demo.site1
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
tar xzf wiki-js.tar.gz
rm wiki-js.tar.gz
cp config.sample.yml config.yml
nano config.yml
Configuração para demo:
port: 3005
bindIP: 0.0.0.0
db:
type: mariadb
host: localhost
port: 3306
user: wikidb_demo_user
pass: password_demo
db: wikidb_demo
ssl: false
Salve e saia. Depois:
exit
Passo 5: Ativar e Iniciar os Serviços
# Ativar e iniciar as três instâncias
sudo systemctl enable --now wikijs@stage
sudo systemctl enable --now wikijs@qa
sudo systemctl enable --now wikijs@demo
Passo 6: Verificação
# Verificar o status de cada instância
sudo systemctl status wikijs@stage --no-pager
sudo systemctl status wikijs@qa --no-pager
sudo systemctl status wikijs@demo --no-pager
# Verificar se as portas estão em escuta
sudo ss -tlnp | grep -E '3003|3004|3005'
Parte 3: Identificar Processos e Portas
Anexo 1: Comandos para Identificar Processos Node.js
1. Exibir Todos os Processos Node com a Unidade systemd
ps -eo pid,user,unit,cmd | grep -w node
2. Versão Compacta: PID + Linha de Comando
pgrep -a node
3. Loop: Para Cada PID Node, Mostrar as Portas em Escuta
for pid in $(pgrep node); do lsof -Pan -p "$pid" -i; done
4. Exibir Diretamente Todos os Sockets Node Abertos
ss -tlnp | grep node
5. Para um PID Específico
# Substitua 1234 pelo PID real
systemctl status --pid=1234
cat /proc/1234/cgroup | grep system.slice
Parte 4: Testar Diferentes Métodos de Parada
Métodos de Parada para Testar
Comando A – Parada Correta via systemd
# Parada limpa da instância stage
sudo systemctl stop wikijs@stage
Análise: Este comando para o serviço de forma limpa via systemd. É o método recomendado.
Comando B – Erro Lógico: Desativa para o Futuro, Não Para Agora
# Desativa o serviço mas não o para imediatamente
sudo systemctl disable wikijs@qa
Análise: Este comando desativa o serviço na inicialização, mas não para se já estiver em execução. O serviço continua rodando até o próximo reboot.
Comando C – ⚠️ Muito Arriscado: Mata Todos os Processos "wikijs"
# Mata todos os processos chamados "wikijs"
sudo killall wikijs
Análise: Este comando é arriscado pois mata todos os processos com esse nome, sem distinção. Pode afetar outros processos não relacionados.
Comando D – Parada Indireta via Porta da Instância Demo (3005)
# Mata o processo que está escutando na porta 3005
sudo fuser -k 3005/tcp
Análise: Este comando identifica e mata o processo que usa a porta 3005. Funciona, mas é menos limpo que o systemctl.
Comando E – Parada Forçada do QA (porta 3004) via lsof + kill -9
# Encontra o PID que escuta na 3004 e o mata
sudo lsof -ti:3004 | xargs sudo kill -9
Análise: Este comando encontra o PID do processo que escuta na porta 3004 e o mata à força. Funciona, mas usa SIGKILL (força bruta).
Comando F – Reload ≠ Stop: Não Interrompe o Serviço
# Recarrega a configuração mas não interrompe o serviço
sudo systemctl reload wikijs@demo
Análise: Este comando recarrega a configuração do serviço mas não o para. O serviço continua funcionando.
Apenas Respostas Corretas
Os comandos que realmente param os serviços são:
# Comando A - Parada limpa
sudo systemctl stop wikijs@stage
# Comando D - Parada via porta
sudo fuser -k 3005/tcp
# Comando E - Parada forçada via porta
sudo lsof -ti:3004 | xargs sudo kill -9
Verificação da Parada
# Verificar se algum serviço ainda está ativo
sudo systemctl status wikijs@stage
sudo systemctl status wikijs@qa
sudo systemctl status wikijs@demo
# Ver se as portas ainda estão em escuta
sudo ss -tlnp | grep node
# Verificar os processos Node.js
ps aux | grep node
Parte 5: Extensão (Opcional)
Reiniciar Limpa Todas as Instâncias
# Reiniciar todas as instâncias em um comando
sudo systemctl restart wikijs@{stage,qa,demo}
Ver Todos os Ports Node.js Ativos no Momento
# Ver todas as portas Node.js em escuta
sudo lsof -iTCP -sTCP:LISTEN | grep node
Verificar se Todas as Portas Foram Liberadas Após Parada
# Parar todas as instâncias
sudo systemctl stop wikijs@{stage,qa,demo}
# Verificar se as portas estão livres
sudo ss -tlnp | egrep '3003|3004|3005'
Anexo 2: Comandos Úteis para Gerenciamento de Serviços
1. Ver Todos os Ports Ativos e Processos Relacionados
| Comando | Comentário / Objetivo |
|---|---|
sudo ss -tuln | Mostra as portas TCP/UDP abertas (escuta), sem resolução DNS (rápido). |
sudo lsof -i -P -n | Mostra todas as portas e os programas que as utilizam. |
sudo lsof -i -P -n | grep node | Filtra para ver apenas processos Node.js. |
sudo netstat -tulnp | Comando antigo equivalente ao ss, também mostra os PIDs. |
sudo apt install net-tools | Instala o netstat (necessário no Ubuntu moderno). |
ps aux | grep node | Lista todos os processos contendo "node". |
sudo lsof -i :3000 | Mostra o processo que escuta especificamente na porta 3000. |
sudo apt install nmap | Instala o nmap, um scanner de portas. |
sudo nmap -sT -O localhost | Escaneia as portas TCP abertas na máquina local. |
2. Gerenciamento de Serviços Node.js com systemd
| Comando | Comentário / Objetivo |
|---|---|
systemctl | grep node | Busca serviços contendo "node". |
systemctl list-units --type=service | Lista todos os serviços em execução. |
ls /etc/systemd/system/ | Lista arquivos .service instalados manualmente. |
sudo systemctl stop nome-do-serviço | Para um serviço de forma limpa (ex: wikijs.service). |
sudo systemctl disable nome-do-serviço | Impede que o serviço inicie no próximo boot. |
sudo rm /etc/systemd/system/nome-do-serviço.service | Remove o arquivo do serviço. |
sudo systemctl daemon-reexec | Recarrega completamente o systemd. |
sudo systemctl daemon-reload | Recarrega os arquivos .service. |
systemctl list-units --type=service | grep -i node | Lista serviços Node.js (case-insensitive). |
systemctl list-units --type=service | grep 3100 | Busca serviços associados à porta 3100. |
sudo systemctl reset-failed | Reseta o estado de serviços com falha. |
3. Parada Manual de um Processo (se não for um serviço)
| Comando | Comentário / Objetivo |
|---|---|
sudo kill 1064738 | Tenta matar o processo (PID 1064738) de forma limpa. |
sudo kill -9 1064738 | Mata o processo à força (SIGKILL). |
ps -fp 1072723 | Mostra detalhes do processo 1072723 (formato estendido). |
sudo ls -l /proc/1072723/exe | Mostra o binário real executado pelo processo. |
sudo cat /proc/1072723/cmdline | tr '\0' ' ' | Mostra o comando exato que iniciou o processo. |
4. Detecção e Parada de Processos Gerenciados pelo PM2
| Comando | Comentário / Objetivo |
|---|---|
which pm2 | Verifica se o pm2 está instalado. |
pm2 list | Lista as aplicações gerenciadas pelo PM2. |
pm2 stop all | Para todas as aplicações PM2. |
pm2 delete all | Remove todas as referências às aplicações. |
pm2 unstartup | Desativa o auto start do PM2 no boot. |
5. Remoção Completa de um Serviço systemd
| Comando | Comentário / Objetivo |
|---|---|
ls /etc/systemd/system/ | grep -i wiki | Filtra arquivos .service relacionados a "wiki". |
sudo systemctl stop wikijs.service | Para o serviço antes de remover. |
sudo systemctl disable wikijs.service | Desativa o serviço. |
sudo rm /etc/systemd/system/wikijs.service | Remove o arquivo do serviço. |
sudo systemctl daemon-reload | Recarrega a configuração do systemd. |
sudo systemctl reset-failed | Reseta erros do systemd. |
systemctl list-units --type=service | grep wiki | Verifica se o serviço sumiu. |
systemctl status wikijs.service | Verifica se o serviço ainda existe. |
ls -l /etc/systemd/system/ | Lista completa para checagem manual. |
grep -r ExecStart /etc/systemd/system/ | Busca linhas de inicialização em todos os serviços. |
Anexo 3: Lista Completa de Comandos
Comandos para Ver Ports
sudo ss -tuln
sudo lsof -i -P -n
sudo lsof -i -P -n | grep node
sudo netstat -tulnp
sudo apt install net-tools
ps aux | grep node
sudo lsof -i :3000
sudo apt install nmap
sudo nmap -sT -O localhost
Comandos systemd
systemctl | grep node
systemctl list-units --type=service
ls /etc/systemd/system/
sudo systemctl stop nom-du-service
sudo systemctl stop wikijs.service
sudo systemctl disable nom-du-service
sudo rm /etc/systemd/system/nom-du-service.service
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
systemctl | grep 3100
systemctl | grep node
sudo systemctl stop wikijs.service
Comandos kill
sudo kill 1064738
sudo kill -9 1064738
sudo ss -tuln | grep 3100
sudo lsof -i :3100
Comandos PM2
which pm2 && pm2 list
pm2 stop all
pm2 delete all
pm2 unstartup
Comandos de Diagnóstico
sudo systemctl list-units --type=service | grep -i node
ps aux | grep node
ps -fp 1072723
sudo ls -l /proc/1072723/exe
sudo cat /proc/1072723/cmdline | tr '\0' ' '
ls /etc/systemd/system/ | grep -i wiki
ls /lib/systemd/system/ | grep -i wiki
grep -r 3100 /etc/systemd/system/
Comandos de Remoção
sudo systemctl stop nom.service
sudo systemctl disable nom.service
sudo systemctl daemon-reload
sudo systemctl reset-failed
ls /etc/systemd/system/
ls /etc/systemd/system/ | grep -i wiki
sudo systemctl stop wikijs.service
sudo systemctl disable wikijs.service
sudo rm /etc/systemd/system/wikijs.service
sudo systemctl daemon-reload
sudo systemctl reset-failed
systemctl list-units --type=service | grep wiki
systemctl status wikijs.service
ls -l /etc/systemd/system/
grep -r ExecStart /etc/systemd/system/
Exercícios Práticos
Exercício 1: Criar e Iniciar as 3 Instâncias
- Crie as 3 instâncias (stage, qa, demo) seguindo os passos acima
- Verifique que todas as instâncias estão ativas
- Verifique que as portas 3003, 3004, 3005 estão em escuta
Exercício 2: Testar os Métodos de Parada
Para cada método de parada (A, B, C, D, E, F):
- Reinicie primeiro a instância em questão
- Execute o comando de parada
- Verifique se o serviço realmente parou
- Documente o resultado em uma tabela
Exercício 3: Comparação dos Métodos
Crie uma tabela comparativa:
| Método | Comando | Funciona? | Por quê? | Recomendado? |
|---|---|---|---|---|
| A | systemctl stop | ? | ? | ? |
| B | systemctl disable | ? | ? | ? |
| C | killall wikijs | ? | ? | ? |
| D | fuser -k port/tcp | ? | ? | ? |
| E | lsof -ti:port | xargs kill -9 | ? | ? | ? |
| F | systemctl reload | ? | ? | ? |
Perguntas de Reflexão
-
Por que
systemctl disablenão para um serviço que já está em execução?- Explique a diferença entre
stopedisable
- Explique a diferença entre
-
Quais são os riscos de usar
killallpara parar serviços?- Dê um exemplo de cenário onde isso pode causar problemas
-
Por que
systemctl reloadnão interrompe o serviço?- Explique a diferença entre
reloaderestart
- Explique a diferença entre
-
Qual a diferença entre
killekill -9?- Em quais casos você usaria cada um desses comandos?
-
Por que usar um template systemd (
wikijs@.service) ao invés de criar 3 arquivos de serviço separados?- Quais são as vantagens e desvantagens de cada abordagem?
Resumo dos Métodos de Parada
Métodos Recomendados ✅
systemctl stop wikijs@instance- Parada limpa via systemdfuser -k port/tcp- Parada via porta (funciona, mas menos limpo)lsof -ti:port \| xargs kill -9- Parada forçada (último recurso)
Métodos a Evitar ❌
systemctl disable- Não para, apenas desativa na inicializaçãosystemctl reload- Recarrega a config, mas não interrompekillall wikijs- Muito arriscado, pode afetar outros processos
Verificação Final
Verifique se você conseguiu:
- Criar o template systemd
wikijs@.service - Criar os 3 usuários do sistema (wikijs_stage, wikijs_qa, wikijs_demo)
- Criar os 3 diretórios e instalar o Wiki.js em cada um
- Criar os 3 bancos de dados MariaDB
- Configurar os arquivos
config.ymlcom as portas corretas - Ativar e iniciar as 3 instâncias
- Verificar que as portas 3003, 3004, 3005 estão em escuta
- Testar todos os métodos de parada
- Entender por que alguns métodos funcionam e outros não
- Responder às perguntas de reflexão
Próximos Passos
- Lab 8.1: Gerenciamento de Serviços systemd (revisão)
- Lab 8.2: Serviços Personalizados (aprofundamento)
- TP 2: Reverse Proxy NGINX (para expor as instâncias via reverse proxy)
Lab criado em: Dezembro 2024