Como Criar Script de Reinicialização Automática do Servidor MU
Aprenda a criar scripts batch e tarefas agendadas para reiniciar automaticamente seu servidor MU Online em caso de queda ou horários programados.
Por Que Automatizar a Reinicialização do Servidor
Servidores MU Online privados rodam múltiplos processos simultaneamente — ConnectServer, DataServer, GameServer e EventServer — e qualquer um deles pode travar ou encerrar inesperadamente por vazamento de memória, erro de banco de dados ou pico de conexões. Sem automação, o servidor fica offline até o administrador perceber e agir manualmente.
Este tutorial cobre duas abordagens complementares:
- Watchdog Script: monitora processos em tempo real e reinicia imediatamente após crash
- Task Scheduler: reinicia os serviços em horários programados, como a madrugada
Estrutura de Arquivos do Servidor MU
Antes de criar os scripts, confirme a estrutura de diretórios do seu servidor:
C:\MuServer\
├── ConnectServer\
│ └── ConnectServer.exe
├── DataServer\
│ └── DataServer.exe
├── GameServer\
│ └── GameServer.exe
├── EventServer\
│ └── EventServer.exe
└── Scripts\
├── start_all.bat
├── stop_all.bat
└── watchdog.bat
Crie o diretório Scripts\ se ele não existir:
mkdir C:\MuServer\Scripts
Parte 1 — Script de Inicialização Completa
Passo 1: Criar o script de start
Crie o arquivo C:\MuServer\Scripts\start_all.bat:
@echo off
title ViciadosMU - Iniciando Servidor
cd /d C:\MuServer
echo [%date% %time%] Iniciando ConnectServer... >> C:\MuServer\Scripts\startup.log
start "ConnectServer" /D "C:\MuServer\ConnectServer\" ConnectServer.exe
timeout /t 5 /nobreak > nul
echo [%date% %time%] Iniciando DataServer... >> C:\MuServer\Scripts\startup.log
start "DataServer" /D "C:\MuServer\DataServer\" DataServer.exe
timeout /t 8 /nobreak > nul
echo [%date% %time%] Iniciando GameServer... >> C:\MuServer\Scripts\startup.log
start "GameServer" /D "C:\MuServer\GameServer\" GameServer.exe
timeout /t 10 /nobreak > nul
echo [%date% %time%] Iniciando EventServer... >> C:\MuServer\Scripts\startup.log
start "EventServer" /D "C:\MuServer\EventServer\" EventServer.exe
echo [%date% %time%] Todos os processos iniciados. >> C:\MuServer\Scripts\startup.log
timeout /t são essenciais. O DataServer precisa estabelecer conexão com o SQL Server antes do GameServer iniciar. Reduza os tempos somente se o banco de dados estiver na mesma máquina e o hardware for rápido.Passo 2: Criar o script de parada
Crie o arquivo C:\MuServer\Scripts\stop_all.bat:
@echo off
title ViciadosMU - Parando Servidor
echo [%date% %time%] Iniciando shutdown... >> C:\MuServer\Scripts\startup.log
taskkill /F /IM EventServer.exe /T 2>nul
timeout /t 3 /nobreak > nul
taskkill /F /IM GameServer.exe /T 2>nul
timeout /t 3 /nobreak > nul
taskkill /F /IM DataServer.exe /T 2>nul
timeout /t 3 /nobreak > nul
taskkill /F /IM ConnectServer.exe /T 2>nul
echo [%date% %time%] Shutdown concluido. >> C:\MuServer\Scripts\startup.log
A ordem de encerramento é inversa à de inicialização: EventServer → GameServer → DataServer → ConnectServer. Isso evita erros de desconexão abrupta no banco.
Parte 2 — Script Watchdog (Monitoramento em Tempo Real)
O watchdog verifica continuamente se os processos estão rodando e os reinicia caso encerrem inesperadamente.
Passo 3: Criar o watchdog.bat
Crie o arquivo C:\MuServer\Scripts\watchdog.bat:
@echo off
title ViciadosMU - Watchdog Ativo
set LOGFILE=C:\MuServer\Scripts\watchdog.log
set INTERVAL=30
:LOOP
echo [%date% %time%] Verificando processos... >> %LOGFILE%
:: Verifica ConnectServer
tasklist /FI "IMAGENAME eq ConnectServer.exe" 2>nul | find /I "ConnectServer.exe" > nul
if errorlevel 1 (
echo [%date% %time%] ALERTA: ConnectServer.exe nao encontrado. Reiniciando... >> %LOGFILE%
start "ConnectServer" /D "C:\MuServer\ConnectServer\" ConnectServer.exe
timeout /t 5 /nobreak > nul
)
:: Verifica DataServer
tasklist /FI "IMAGENAME eq DataServer.exe" 2>nul | find /I "DataServer.exe" > nul
if errorlevel 1 (
echo [%date% %time%] ALERTA: DataServer.exe nao encontrado. Reiniciando... >> %LOGFILE%
start "DataServer" /D "C:\MuServer\DataServer\" DataServer.exe
timeout /t 8 /nobreak > nul
)
:: Verifica GameServer
tasklist /FI "IMAGENAME eq GameServer.exe" 2>nul | find /I "GameServer.exe" > nul
if errorlevel 1 (
echo [%date% %time%] ALERTA: GameServer.exe nao encontrado. Reiniciando... >> %LOGFILE%
start "GameServer" /D "C:\MuServer\GameServer\" GameServer.exe
timeout /t 10 /nobreak > nul
)
:: Verifica EventServer
tasklist /FI "IMAGENAME eq EventServer.exe" 2>nul | find /I "EventServer.exe" > nul
if errorlevel 1 (
echo [%date% %time%] ALERTA: EventServer.exe nao encontrado. Reiniciando... >> %LOGFILE%
start "EventServer" /D "C:\MuServer\EventServer\" EventServer.exe
)
timeout /t %INTERVAL% /nobreak > nul
goto LOOP
stop_all.bat dentro do watchdog.Parte 3 — Reinicialização Programada via Task Scheduler
Para servidores com reinicialização diária programada, como às 04:00, para limpeza de memória e manutenção:
Passo 4: Criar o script de restart agendado
Crie C:\MuServer\Scripts\scheduled_restart.bat:
@echo off
title ViciadosMU - Restart Agendado
set LOGFILE=C:\MuServer\Scripts\scheduled.log
echo [%date% %time%] Iniciando restart agendado... >> %LOGFILE%
:: Para todos os processos
call C:\MuServer\Scripts\stop_all.bat
timeout /t 15 /nobreak > nul
:: Remove logs com mais de 7 dias
forfiles /p C:\MuServer\Scripts\ /m *.log /d -7 /c "cmd /c del @path" 2>nul
:: Reinicia todos os processos
call C:\MuServer\Scripts\start_all.bat
echo [%date% %time%] Restart agendado concluido. >> %LOGFILE%
Passo 5: Configurar o Task Scheduler do Windows
Execute os comandos abaixo no Prompt de Comando como Administrador:
:: Criar tarefa de restart diário às 04:00
schtasks /create /tn "MuServer_DailyRestart" /tr "C:\MuServer\Scripts\scheduled_restart.bat" /sc daily /st 04:00 /ru SYSTEM /f
:: Criar tarefa para iniciar o watchdog no boot do sistema
schtasks /create /tn "MuServer_Watchdog" /tr "C:\MuServer\Scripts\watchdog.bat" /sc onstart /delay 0002:00 /ru SYSTEM /f
/delay 0002:00) garante que o SQL Server já esteja completamente inicializado antes do watchdog começar a monitorar. Ajuste para 0003:00 em servidores com SQL Server instalado em HDD ao invés de SSD.Passo 6: Verificar as tarefas criadas
schtasks /query /tn "MuServer_DailyRestart" /fo LIST
schtasks /query /tn "MuServer_Watchdog" /fo LIST
A saída deve mostrar Status: Ready para ambas as tarefas.
Parte 4 — Registro de Crashes no SQL Server
Para manter histórico de restarts no banco de dados e identificar padrões de instabilidade:
Passo 7: Criar tabela de log no banco
USE MuOnline
GO
CREATE TABLE T_ServerRestartLog (
LogID INT IDENTITY(1,1) PRIMARY KEY,
RestartTime DATETIME DEFAULT GETDATE(),
ProcessName NVARCHAR(50) NOT NULL,
RestartType NVARCHAR(20) NOT NULL, -- 'CRASH', 'SCHEDULED', 'MANUAL'
Notes NVARCHAR(255) NULL
)
GO
CREATE INDEX IX_ServerRestartLog_Time
ON T_ServerRestartLog (RestartTime DESC)
GO
Passo 8: Integrar sqlcmd ao watchdog
Dentro de cada bloco de restart no watchdog.bat, adicione a chamada ao sqlcmd logo após o comando start:
:: Bloco do GameServer como exemplo:
if errorlevel 1 (
echo [%date% %time%] ALERTA: GameServer.exe nao encontrado. Reiniciando... >> %LOGFILE%
start "GameServer" /D "C:\MuServer\GameServer\" GameServer.exe
sqlcmd -S localhost -d MuOnline -E -Q "INSERT INTO T_ServerRestartLog (ProcessName, RestartType) VALUES ('GameServer', 'CRASH')"
timeout /t 10 /nobreak > nul
)
-E para autenticacao Windows Integrated ou substitua por -U sa -P SuaSenha para SQL Authentication. Em producao, armazene credenciais em variaveis de ambiente do Windows e nao em texto puro no script .bat.Para consultar o histórico de crashes das últimas 24 horas:
SELECT ProcessName, RestartType, RestartTime
FROM MuOnline..T_ServerRestartLog
WHERE RestartTime >= DATEADD(HOUR, -24, GETDATE())
ORDER BY RestartTime DESC
Troubleshooting
Processo reinicia mas fecha imediatamente: Verifique o log de erros do executável. O GameServer.exe gera registros em C:\MuServer\GameServer\Log\. Erros de conexão com o banco são os mais comuns — confirme a string de conexão em C:\MuServer\GameServer\Data\GameServerInfo.ini, especialmente os valores ServerAddress, ServerPort e DbName.
Watchdog não detecta que o processo caiu: Confirme o nome exato do executável com tasklist | findstr /I "server". Alguns builds usam nomes como MuGameServer.exe ou gs.exe. Atualize o nome no script conforme o resultado.
Task Scheduler não executa o script: A conta SYSTEM precisa de acesso de leitura e escrita em C:\MuServer\. Corrija as permissões com:
icacls C:\MuServer /grant "NT AUTHORITY\SYSTEM:(OI)(CI)F" /T
Log do watchdog cresce indefinidamente: Use rotação diária incorporando a data no nome do arquivo:
set LOGFILE=C:\MuServer\Scripts\watchdog_%date:~6,4%%date:~3,2%%date:~0,2%.log
GameServer não conecta ao banco após restart automático: O SQL Server pode não ter terminado de inicializar. Aumente o delay do watchdog no boot de 0002:00 para 0005:00 e adicione uma verificação de serviço antes de iniciar os processos MU:
:WAIT_SQL
sc query MSSQLSERVER | find "RUNNING" > nul
if errorlevel 1 (
timeout /t 10 /nobreak > nul
goto WAIT_SQL
)
call C:\MuServer\Scripts\start_all.bat
Perguntas frequentes
O script pode reiniciar apenas um componente específico, como o GameServer?
Sim. Crie um arquivo .bat separado para cada processo e aponte o monitoramento apenas para o executável desejado, como GameServer.exe. Cada componente pode ter seu próprio watchdog independente.
Como evitar que o script reinicie o servidor durante Castle Siege?
Adicione uma verificação SQL antes do restart: SELECT SiegeState FROM MuOnline..T_CastleSiegeState. Se retornar 1, o script aguarda e verifica novamente em 5 minutos com timeout /t 300 antes de prosseguir.
O Task Scheduler é confiável para manter o servidor no ar 24/7?
Para produção, combine o Task Scheduler com um watchdog em loop contínuo. O Task Scheduler sozinho só reinicia em horários fixos e não detecta crash em tempo real.
Qual o intervalo mínimo recomendado entre verificações do watchdog?
30 segundos é o mínimo prático. Intervalos menores consomem CPU desnecessariamente. Para servidores com alto volume de jogadores, use 60 segundos e combine com alertas por e-mail via blat.exe.