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

Cómo automatizar tareas con el Task Scheduler en el servidor de MU

Usa el Programador de Tareas de Windows para automatizar reinicios, backups, limpieza de logs y eventos de tu servidor de MU Online, con scripts listos y un método para diagnosticar tareas que no se disparan.

BR Bruno · Actualizado el 14 jul 2026 · ⏱ 20 min de lectura
Respuesta rápida

Un servidor de MU Online vive de rutina: reiniciar procesos para liberar memoria, generar backup de la base, limpiar logs que inflan el disco, activar y desactivar eventos de temporada, y garantizar que todo vuelva a subir después de un reinicio del VPS. Hacerlo a mano funciona mientras estás en lín

Un servidor de MU Online vive de rutina: reiniciar procesos para liberar memoria, generar backup de la base, limpiar logs que inflan el disco, activar y desactivar eventos de temporada, y garantizar que todo vuelva a subir después de un reinicio del VPS. Hacerlo a mano funciona mientras estás en línea y te acuerdas — y falla exactamente el fin de semana en que viajaste. El Programador de Tareas de Windows (Task Scheduler) resuelve esto gratis, con lo que ya viene instalado en Windows Server. Este tutorial muestra un método completo: qué tareas de MU vale la pena automatizar, cómo escribirlas como scripts robustos, cómo programarlas correctamente y cómo diagnosticar la causa número uno de dolor de cabeza — la tarea que aparece como "completada" pero no hizo nada. Todas las rutas, horarios y nombres de servicio aquí son ejemplos y varían según el proveedor/versión de tu emulador y de Windows.

Requisitos previos

Antes de programar cualquier cosa, necesitas un servidor de MU ya funcionando para automatizar — no tiene sentido programar el reinicio de un GameServer que todavía no corre. Si aún estás montando la base, empieza por cómo crear un servidor de MU Online y vuelve aquí después. Asumiendo el servidor en línea, vas a necesitar:

  • Acceso administrador al Windows Server del VPS (vía RDP), porque crear tareas que corren sin sesión exige privilegio elevado.
  • Las rutas absolutas de las carpetas del servidor: dónde está el GameServer.exe, el ConnectServer.exe, el JoinServer.exe y la carpeta de logs. Anótalas, las vas a usar mucho.
  • Una noción de PowerShell básico. No hace falta ser experto; los scripts de abajo están comentados y tú adaptas las rutas.
  • Espacio en disco reservado para backups y una política de retención definida (cuántos días guardar). La automatización sin retención llena el disco y tira el servidor — lo opuesto a lo que querías.
Dica: Crea una carpeta única D:\Scripts\ en el servidor y guarda todos tus scripts de automatización allí. Tener todo en un solo lugar facilita el backup, el versionado y el momento de pasar el servidor a otro admin.

Qué vale la pena automatizar en un servidor de MU

No toda tarea debe automatizarse, y no todo horario es adecuado. La tabla de abajo lista las automatizaciones más comunes en servidores de MU, con la frecuencia típica y el horario sugerido. Los valores son ejemplo y varían según el proveedor/versión y según el perfil de jugadores de tu servidor.

TareaFrecuencia típicaHorario sugeridoDisparador recomendado
Reinicio del GameServerDiaria05:00 (menor pico)Por horario
Backup de la base de datosDiaria + cada 6h05:15 + intervalosPor horario
Limpieza de logs antiguosSemanalDomingo 04:00Por horario
Subir servidor tras reinicioBajo demandaAl iniciar el sistema
Activar evento de temporadaEstacionalSegún calendarioPor horario
Verificación de proceso vivoCada 5 minPor horario (repetición)

La regla de oro: automatiza lo que es repetitivo, previsible y de bajo riesgo. Reinicio, backup y limpieza entran fácil. En cambio, una migración de base o una actualización de versión del emulador no deben automatizarse — son operaciones que exigen ojo humano y punto de decisión.

Paso 1 — Escribir el script de reinicio del GameServer

Antes de programar, escribe el script. Una tarea programada es solo un disparador; la inteligencia está en el script que dispara. Este ejemplo en PowerShell para el reinicio del GameServer, con aviso, verificación y log:

# Script: ReiniciarGameServer.ps1
# Reinicia el GameServer de forma controlada, con log.

param(
    [string]$GameServerDir  = "D:\MuServer\GameServer",
    [string]$GameServerExe  = "GameServer.exe",
    [string]$LogDir         = "D:\Scripts\Logs"
)

$LogFile = Join-Path $LogDir ("reinicio_{0}.log" -f (Get-Date -Format 'yyyyMM'))

function Write-Log {
    param([string]$Msg)
    $line = "[{0}] {1}" -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'), $Msg
    Add-Content -Path $LogFile -Value $line
}

Write-Log "=== Iniciando reinicio controlado del GameServer ==="

# 1 -> Cierra el proceso actual, si esta corriendo
$proc = Get-Process -Name ($GameServerExe -replace '\.exe$','') -ErrorAction SilentlyContinue
if ($proc) {
    Write-Log "GameServer corriendo (PID $($proc.Id)). Cerrando..."
    Stop-Process -Id $proc.Id -Force
    Start-Sleep -Seconds 5
} else {
    Write-Log "GameServer no estaba corriendo."
}

# 2 -> Sube el GameServer nuevamente
$exePath = Join-Path $GameServerDir $GameServerExe
if (Test-Path $exePath) {
    Start-Process -FilePath $exePath -WorkingDirectory $GameServerDir
    Write-Log "GameServer iniciado desde $exePath"
} else {
    Write-Log "ERROR: ejecutable no encontrado en $exePath"
    exit 1
}

Write-Log "=== Reinicio completado ==="

Fíjate en tres detalles que separan un script amateur de uno profesional: ruta absoluta (nunca relativa), el WorkingDirectory definido explícitamente (el MU depende de archivos en su carpeta), y el log con fecha. Sin el log te quedas ciego cuando algo falle a las 5 de la mañana.

Atenção: Muchos emuladores de MU necesitan el GameServer corriendo en sesión interactiva (ventana visible), no como servicio. Si el tuyo es así, Start-Process funciona con la sesión abierta, pero al cerrar el RDP la ventana puede cerrarse dependiendo de la configuración. Prueba el comportamiento de tu emulador antes de confiar en el reinicio automático sin supervisión.

Paso 2 — Crear la tarea en el Programador (interfaz gráfica)

Con el script listo, prográmalo. Abre el Programador de Tareas (taskschd.msc) y sigue:

  1. En el panel derecho, haz clic en Crear Tarea (no "Crear Tarea Básica" — la completa da más control).
  2. En la pestaña General: dale el nombre MU_Reinicio_GameServer, marca Ejecutar tanto si el usuario inició sesión como si no y Ejecutar con los privilegios más altos.
  3. En la pestaña Desencadenadores: nuevo desencadenador, Diariamente, horario 05:00.
  4. En la pestaña Acciones: nueva acción, Iniciar un programa. En el campo Programa: powershell.exe. En Argumentos: -NonInteractive -ExecutionPolicy Bypass -File "D:\Scripts\ReiniciarGameServer.ps1". En el campo Iniciar en: D:\Scripts\.
  5. En la pestaña Condiciones: desmarca "Iniciar la tarea solo si el equipo está conectado a la corriente alterna" (el VPS corre 24h).
  6. En la pestaña Configuración: marca "Ejecutar la tarea lo antes posible tras perder un inicio programado".

El campo Iniciar en del paso 4 es el que más gente olvida y el que más causa la falla silenciosa: sin él, PowerShell corre desde System32 y cualquier ruta relativa se rompe.

Paso 3 — Crear tareas por línea de comandos (schtasks)

Para automatización a escala, o para documentar la creación de la tarea en un script de setup, usa schtasks. Es el mismo programador, sin clics:

# Crea la tarea de reinicio diario a las 05:00, corriendo como SYSTEM
schtasks /Create `
  /TN "MU_Reinicio_GameServer" `
  /TR "powershell.exe -NonInteractive -ExecutionPolicy Bypass -File D:\Scripts\ReiniciarGameServer.ps1" `
  /SC DAILY `
  /ST 05:00 `
  /RU "SYSTEM" `
  /RL HIGHEST `
  /F

# Crea tarea que sube todos los servidores al iniciar Windows
schtasks /Create `
  /TN "MU_Subir_ServidoresBoot" `
  /TR "powershell.exe -NonInteractive -ExecutionPolicy Bypass -File D:\Scripts\SubirTudo.ps1" `
  /SC ONSTART `
  /RU "SYSTEM" `
  /RL HIGHEST `
  /F

# Lista todas las tareas MU creadas
schtasks /Query /TN "MU_Reinicio_GameServer" /V /FO LIST

La tarea MU_Subir_ServidoresBoot con /SC ONSTART es una de las más valiosas: si el VPS se reinicia solo de madrugada (actualización forzada, caída de energía en el datacenter), tus servidores vuelven solos, en el orden correcto, sin que tengas que despertarte.

Paso 4 — Script maestro que sube los servidores en el orden correcto

El MU tiene orden de inicio: primero la base de datos debe estar en línea, luego DataServer/ConnectServer, luego JoinServer, y por último los GameServers. Subir todo de una vez, fuera de orden, genera errores de conexión. Un script maestro lo resuelve:

# Script: SubirTudo.ps1
# Sube los componentes del MU en el orden correcto, con espera entre ellos.

$base = "D:\MuServer"
$LogFile = "D:\Scripts\Logs\boot_$(Get-Date -Format 'yyyyMM').log"

function Log($m){ Add-Content $LogFile "[$(Get-Date -f 'yyyy-MM-dd HH:mm:ss')] $m" }
function Subir($nome, $pasta, $exe){
    $p = Join-Path $base "$pasta\$exe"
    if(Test-Path $p){
        Start-Process -FilePath $p -WorkingDirectory (Join-Path $base $pasta)
        Log "$nome iniciado."
    } else { Log "ERROR: $nome no encontrado en $p" }
}

Log "=== BOOT del servidor MU ==="

# 1 -> Espera a que SQL Server este listo (ejemplo: espera fija)
Log "Esperando la base de datos..."
Start-Sleep -Seconds 30

Subir "DataServer"    "DataServer"    "DataServer.exe";    Start-Sleep 8
Subir "ConnectServer" "ConnectServer" "ConnectServer.exe"; Start-Sleep 5
Subir "JoinServer"    "JoinServer"    "JoinServer.exe";    Start-Sleep 5
Subir "GameServer"    "GameServer"    "GameServer.exe"

Log "=== BOOT completado ==="

Los tiempos de espera (Start-Sleep) son ejemplo y varían según el proveedor/versión y según el hardware del VPS. En un servidor más lento, auméntalos. Lo ideal, en vez de espera fija, es verificar si el puerto del componente anterior ya responde antes de subir el siguiente — pero la espera fija ya resuelve la mayoría de los casos.

Paso 5 — Tarea de vigilancia (el servidor cayó, sube de nuevo)

Una tarea que corre cada pocos minutos y verifica si el GameServer está vivo transforma una caída de madrugada en un hipo de 3 minutos en vez de horas offline:

# Script: VigiaGameServer.ps1 - programa con repeticion cada 5 min
$nome = "GameServer"
$proc = Get-Process -Name $nome -ErrorAction SilentlyContinue
if(-not $proc){
    Add-Content "D:\Scripts\Logs\vigia.log" "[$(Get-Date -f 'HH:mm:ss')] GameServer cayo. Subiendo..."
    Start-Process "D:\MuServer\GameServer\GameServer.exe" -WorkingDirectory "D:\MuServer\GameServer"
}

Para programar la repetición: en la pestaña Desencadenadores, crea un desencadenador diario y, en "Configuración avanzada", marca Repetir la tarea cada 5 minutos por una duración de "Indefinidamente".

Dica: La vigilancia es genial, pero cuidado con el efecto secundario: si el GameServer está trabado en un bucle de crash, el vigía lo va a resucitar cada 5 minutos indefinidamente, enmascarando el problema real. Agrega al log un contador de reinicios y configura una alerta si sube demasiado en una hora.

Errores comunes y soluciones

SíntomaCausa probableSolución
Tarea "completada" pero el script no hizo nadaRuta relativa o campo "Iniciar en" vacíoUsa rutas absolutas y completa "Iniciar en" con la carpeta del script
Código de resultado 0x1 en el historialError dentro del script (archivo no encontrado, permiso)Abre el log del script; córrelo manualmente con el mismo usuario de la tarea
La tarea no se dispara en el horarioCondición de corriente alterna marcada, o zona/hora del servidor malDesmarca la condición de CA; verifica el reloj del VPS
0x41301 "en ejecución" trabadaLa instancia anterior no cerróMarca "Detener la tarea si corre más de X horas"; revisa el script
El script corre en mi login pero no sin sesiónNecesita sesión interactiva (ventana)Mantén la sesión, o corre el proceso como servicio con herramienta dedicada
ExecutionPolicy bloquea el scriptPolítica de ejecución restrictivaUsa -ExecutionPolicy Bypass en el argumento, como en los ejemplos
Historial de la tarea vacíoHistorial del Programador desactivadoEn el panel derecho, haz clic en "Habilitar Historial de Todas las Tareas"

El error campeón es el primero de la tabla. Siempre que una tarea "funcione" pero nada ocurra, el primer reflejo debe ser: ¿ruta absoluta? ¿"Iniciar en" completado? ¿Cuenta con permiso en la carpeta? El noventa por ciento de los casos mueren ahí.

Buenas prácticas de operación

Automatización sin observabilidad es una bomba de tiempo. Tres hábitos evitan la mayoría de los desastres:

  1. Todo script escribe log con fecha y hora. Cuando algo falla a las 5h, el log es el único testigo.
  2. Toda tarea manda alerta en caso de falla. Un Send-MailMessage o un webhook de Discord en el bloque de error te avisa antes de que el jugador reclame.
  3. Revisa el historial semanalmente. Cinco minutos mirando los códigos de resultado de las tareas revelan problemas antes de que se vuelvan caídas.

Y prueba cada tarea manualmente antes de confiar en ella: en el Programador, clic derecho en la tarea, Ejecutar. Si corre bien bajo demanda pero falla en el horario, el problema está en el disparador o en la cuenta — no en el script.

Lista de verificación de lanzamiento

  • Rutas absolutas de GameServer, ConnectServer, JoinServer y logs anotadas
  • Carpeta D:\Scripts\ creada con todos los scripts versionados
  • Script de reinicio probado manualmente y generando log
  • Tarea de reinicio diario creada, con "Iniciar en" completado
  • Tarea de boot (ONSTART) subiendo los servidores en el orden correcto
  • Tarea de backup programada e integrada con la política de retención
  • Tarea de vigilancia cada 5 min con contador de reinicios
  • Condición de corriente alterna desmarcada en todas las tareas
  • "Ejecutar lo antes posible si se pierde el horario" marcado donde tenga sentido
  • Historial del Programador de Tareas habilitado
  • Alertas de falla (e-mail o Discord) configuradas en los scripts críticos
  • Reloj y zona horaria del VPS verificados
  • Cada tarea ejecutada manualmente ("Ejecutar") y validada antes del lanzamiento

Con esas tareas en su lugar, tu servidor de MU pasa a cuidarse solo la mayor parte del tiempo: reinicia limpio, hace backup, se levanta tras un reinicio y avisa cuando algo sale mal. Dejas de ser rehén del "espero que nadie me necesite de madrugada" y ganas el bien más escaso de quien administra un servidor: sueño.

Preguntas frecuentes

¿Qué es el Task Scheduler y por qué usarlo en un servidor de MU?

El Task Scheduler (Programador de Tareas) es el servicio nativo de Windows que dispara programas y scripts en horarios o eventos definidos, sin intervención humana. En un servidor de MU resuelve el problema de la disciplina: reiniciar el GameServer de madrugada, correr backups, limpiar logs y activar eventos dejan de depender de que te acuerdes. Mientras el servidor esté encendido, la tarea corre. Es gratis, ya viene con Windows Server y no exige software extra.

¿Necesito dejar la sesión de Windows abierta para que las tareas corran?

No, y esa es justamente la ventaja. Marca la opción Ejecutar tanto si el usuario inició sesión como si no y la tarea corre como servicio, incluso sin nadie conectado por RDP. El detalle es que las tareas que abren ventana (como una ventana de consola del GameServer que necesita quedar visible) exigen sesión interactiva; para esas, o mantienes la sesión, o usas una herramienta que corra el proceso como servicio. Varía según la versión de Windows Server.

¿Por qué mi tarea aparece como completada pero el script no hizo nada?

Casi siempre es una ruta relativa o un permiso. El Task Scheduler corre la tarea desde una carpeta que no es la de tu script, así que rutas como .\\GameServer.exe fallan silenciosamente; usa siempre rutas absolutas y completa el campo Iniciar en. El otro motivo común es la cuenta: si la tarea corre como SYSTEM o como un usuario sin acceso a la carpeta del MU, el script no logra leer los archivos. Verifica el código de resultado en el historial de la tarea.

¿Puedo reiniciar el GameServer automáticamente sin echar a los jugadores en medio de un evento?

Se puede, con cuidado. Lo ideal es programar el reinicio para el horario de menor movimiento (madrugada) y enviar un aviso en el juego antes, si tu emulador soporta broadcast por línea de comandos. Un script bien hecho verifica si hay un evento crítico en curso (Castle Siege, por ejemplo) y aplaza el reinicio. Nunca programes reinicio automático encima del horario de eventos importantes; el remedio se vuelve problema.

¿Cuál es la diferencia entre programar por horario y programar por evento?

Programar por horario dispara la tarea con un reloj (todos los días a las 5h, por ejemplo) y es lo más usado para backup y reinicio. Programar por evento dispara la tarea cuando algo ocurre en Windows: al iniciar el sistema, al detenerse un servicio, o cuando un ID específico aparece en el Registro de Eventos. Para MU, el disparador al iniciar el sistema es oro: garantiza que ConnectServer, JoinServer y GameServer suban solos después de un reinicio inesperado del VPS.

BR
Editor de eventos, mapas e ítems

Bruno es especialista en eventos, mapas, bosses y economía de ítems de MU Online. Documenta cada detalle basándose en el juego real.

Sigue leyendo

Artículos relacionados