Cómo Crear Script de Reinicio Automático del Servidor MU
Aprende a crear scripts batch y tareas programadas para reiniciar automáticamente tu servidor MU Online tras un crash o en un horario diario fijo.
Por Qué Automatizar el Reinicio del Servidor
Un servidor privado de MU Online ejecuta múltiples procesos al mismo tiempo — ConnectServer, DataServer, GameServer y EventServer — y cualquiera de ellos puede bloquearse o cerrarse inesperadamente por fugas de memoria, errores de base de datos o picos de conexiones. Sin automatización, el servidor permanece offline hasta que el administrador lo note y actúe manualmente.
Este tutorial cubre dos enfoques complementarios:
- Watchdog Script: monitorea los procesos en tiempo real y los reinicia inmediatamente tras un crash
- Task Scheduler: reinicia todos los servicios en horarios programados, como la madrugada
Estructura de Directorios del Servidor MU
Antes de crear los scripts, confirma la estructura de directorios de tu servidor:
C:\MuServer\
├── ConnectServer\
│ └── ConnectServer.exe
├── DataServer\
│ └── DataServer.exe
├── GameServer\
│ └── GameServer.exe
├── EventServer\
│ └── EventServer.exe
└── Scripts\
├── start_all.bat
├── stop_all.bat
└── watchdog.bat
Crea el directorio Scripts\ si no existe:
mkdir C:\MuServer\Scripts
Parte 1 — Script de Inicio Completo
Paso 1: Crear el script de inicio
Crea el archivo 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 los procesos iniciados. >> C:\MuServer\Scripts\startup.log
timeout /t son esenciales. El DataServer debe establecer conexión con SQL Server antes de que el GameServer arranque. Reduce los tiempos solo si la base de datos está en la misma máquina y el hardware es suficientemente rápido.Paso 2: Crear el script de parada
Crea el archivo C:\MuServer\Scripts\stop_all.bat:
@echo off
title ViciadosMU - Deteniendo 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 completado. >> C:\MuServer\Scripts\startup.log
El orden de cierre es inverso al de inicio: EventServer → GameServer → DataServer → ConnectServer. Esto evita errores de desconexión abrupta en la base de datos.
Parte 2 — Script Watchdog (Monitoreo en Tiempo Real)
El watchdog comprueba continuamente si los procesos están en ejecución y los reinicia en caso de que se hayan cerrado inesperadamente.
Paso 3: Crear watchdog.bat
Crea el archivo C:\MuServer\Scripts\watchdog.bat:
@echo off
title ViciadosMU - Watchdog Activo
set LOGFILE=C:\MuServer\Scripts\watchdog.log
set INTERVAL=30
:LOOP
echo [%date% %time%] Verificando procesos... >> %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 no 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 no 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 no 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 no encontrado. Reiniciando... >> %LOGFILE%
start "EventServer" /D "C:\MuServer\EventServer\" EventServer.exe
)
timeout /t %INTERVAL% /nobreak > nul
goto LOOP
stop_all.bat desde dentro del watchdog.Parte 3 — Reinicio Programado con Task Scheduler
Para servidores que necesitan un reinicio diario programado, por ejemplo a las 04:00 para liberar memoria y realizar tareas de mantenimiento:
Paso 4: Crear el script de reinicio programado
Crea C:\MuServer\Scripts\scheduled_restart.bat:
@echo off
title ViciadosMU - Reinicio Programado
set LOGFILE=C:\MuServer\Scripts\scheduled.log
echo [%date% %time%] Iniciando reinicio programado... >> %LOGFILE%
:: Detiene todos los procesos
call C:\MuServer\Scripts\stop_all.bat
timeout /t 15 /nobreak > nul
:: Elimina logs con mas de 7 dias
forfiles /p C:\MuServer\Scripts\ /m *.log /d -7 /c "cmd /c del @path" 2>nul
:: Reinicia todos los procesos
call C:\MuServer\Scripts\start_all.bat
echo [%date% %time%] Reinicio programado completado. >> %LOGFILE%
Paso 5: Registrar las tareas en el Task Scheduler de Windows
Ejecuta los siguientes comandos en un Símbolo del sistema elevado (Ejecutar como administrador):
:: Crear tarea de reinicio diario a las 04:00
schtasks /create /tn "MuServer_DailyRestart" /tr "C:\MuServer\Scripts\scheduled_restart.bat" /sc daily /st 04:00 /ru SYSTEM /f
:: Crear tarea del watchdog al iniciar el sistema
schtasks /create /tn "MuServer_Watchdog" /tr "C:\MuServer\Scripts\watchdog.bat" /sc onstart /delay 0002:00 /ru SYSTEM /f
/delay 0002:00) en la tarea del watchdog garantiza que SQL Server esté completamente inicializado antes de que comience el monitoreo. Auméntalo a 0003:00 en servidores donde SQL Server está instalado en HDD en lugar de SSD.Paso 6: Verificar las tareas creadas
schtasks /query /tn "MuServer_DailyRestart" /fo LIST
schtasks /query /tn "MuServer_Watchdog" /fo LIST
Ambas tareas deben mostrar Status: Ready en la salida.
Parte 4 — Registro de Crashes en SQL Server
Para mantener un historial de reinicios en la base de datos e identificar patrones de inestabilidad:
Paso 7: Crear la tabla de log
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
Paso 8: Integrar sqlcmd al watchdog
Dentro de cada bloque de reinicio en watchdog.bat, agrega la llamada a sqlcmd inmediatamente después del comando start:
:: Bloque del GameServer como ejemplo:
if errorlevel 1 (
echo [%date% %time%] ALERTA: GameServer.exe no 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 autenticacion integrada de Windows, o sustituyelo por -U sa -P TuPassword para autenticacion SQL Server. En produccion, almacena las credenciales en variables de entorno de Windows y no en texto plano dentro de archivos .bat.Para consultar el historial de crashes de las últimas 24 horas:
SELECT ProcessName, RestartType, RestartTime
FROM MuOnline..T_ServerRestartLog
WHERE RestartTime >= DATEADD(HOUR, -24, GETDATE())
ORDER BY RestartTime DESC
Resolución de Problemas
El proceso se reinicia pero se cierra de inmediato: Revisa el log de errores del propio ejecutable. GameServer.exe escribe en C:\MuServer\GameServer\Log\. Los fallos de conexión con la base de datos son la causa más frecuente. Verifica la cadena de conexión en C:\MuServer\GameServer\Data\GameServerInfo.ini, especialmente los valores ServerAddress, ServerPort y DbName.
El watchdog no detecta que el proceso se ha cerrado: Confirma el nombre exacto del ejecutable con tasklist | findstr /I "server". Algunas builds usan nombres distintos como MuGameServer.exe o gs.exe. Actualiza el script con el nombre que encuentres.
El Task Scheduler no ejecuta el script: La cuenta SYSTEM necesita acceso de lectura y escritura en C:\MuServer\. Corrige los permisos con:
icacls C:\MuServer /grant "NT AUTHORITY\SYSTEM:(OI)(CI)F" /T
El log del watchdog crece sin límite: Usa rotación diaria incorporando la fecha en el nombre del archivo:
set LOGFILE=C:\MuServer\Scripts\watchdog_%date:~6,4%%date:~3,2%%date:~0,2%.log
El GameServer no conecta a la base de datos después de un reinicio automático: SQL Server puede no haber terminado de inicializarse. Aumenta el delay de arranque de 0002:00 a 0005:00 y agrega una verificación del servicio antes de lanzar los procesos 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
¿El script puede reiniciar solo un componente específico, como el GameServer?
Sí. Crea un archivo .bat separado para cada proceso y apunta el monitoreo únicamente al ejecutable deseado, como GameServer.exe. Cada componente puede tener su propio watchdog independiente.
¿Cómo evito que el script reinicie el servidor durante un Castle Siege activo?
Agrega una verificación SQL antes del reinicio: SELECT SiegeState FROM MuOnline..T_CastleSiegeState. Si devuelve 1, el script espera y vuelve a comprobar en 5 minutos con timeout /t 300 antes de continuar.
¿El Task Scheduler de Windows es confiable para mantener el servidor activo 24/7?
Para producción, combina el Task Scheduler con un watchdog en bucle continuo. El Task Scheduler solo reinicia en horarios fijos y no detecta crashes en tiempo real.
¿Cuál es el intervalo mínimo recomendado entre verificaciones del watchdog?
30 segundos es el mínimo práctico. Intervalos más cortos desperdician CPU sin beneficio. Para servidores con alto tráfico, usa 60 segundos y combínalo con alertas por correo electrónico mediante blat.exe.