El mayor portal de MU Online de Brasil — desde 2003
Tutorial Intermedio Tutoriais

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.

EQ Equipo ViciadosMU · Actualizado el 3 jul 2026 · ⏱ 12 min de lectura

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
Nota: Esta guía fue escrita para Windows Server 2012/2016/2019 con MuServer Season 6 Episode 3. Los scripts funcionan en versiones anteriores con ajustes mínimos en los nombres de los ejecutables.

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
Dica: Los delays con 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
Atenção: El watchdog reinicia los procesos de forma individual. Si el GameServer se bloquea mientras el DataServer sigue activo, solo se reinicia el GameServer, evitando pérdida de datos innecesaria. Nunca llames a 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
Dica: El delay de 2 minutos (/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
)
Nota: Usa -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.

EQ

Equipo ViciadosMU

Equipe editorial do ViciadosMU — portal de MU Online no ar desde 2003.

Sigue leyendo

Artículos relacionados