Como automatizar tarefas com o Task Scheduler no servidor de MU
Use o Agendador de Tarefas do Windows para automatizar reinícios, backups, limpeza de logs e eventos do seu servidor de MU Online, com scripts prontos e um método para diagnosticar tarefas que não disparam.
Um servidor de MU Online vive de rotina: reiniciar processos para liberar memória, gerar backup do banco, limpar logs que incham o disco, ligar e desligar eventos sazonais, e garantir que tudo suba de novo depois de um reboot do VPS. Fazer isso na mão funciona enquanto você está online e lembra — e
Um servidor de MU Online vive de rotina: reiniciar processos para liberar memória, gerar backup do banco, limpar logs que incham o disco, ligar e desligar eventos sazonais, e garantir que tudo suba de novo depois de um reboot do VPS. Fazer isso na mão funciona enquanto você está online e lembra — e falha exatamente no fim de semana em que você viajou. O Agendador de Tarefas do Windows (Task Scheduler) resolve isso de graça, com o que já vem instalado no Windows Server. Este tutorial mostra um método completo: quais tarefas de MU vale a pena automatizar, como escrevê-las como scripts robustos, como agendá-las corretamente e como diagnosticar a causa número um de dor de cabeça — a tarefa que aparece como "concluída" mas não fez nada. Todos os caminhos, horários e nomes de serviço aqui são exemplos e variam por provedor/versão do seu emulador e do Windows.
Pré-requisitos
Antes de agendar qualquer coisa, você precisa de um servidor de MU já funcionando para automatizar — não faz sentido agendar o reinício de um GameServer que ainda não roda. Se você ainda está montando a base, comece por como criar um servidor de MU Online e volte aqui depois. Assumindo o servidor no ar, você vai precisar de:
- Acesso administrador ao Windows Server do VPS (via RDP), porque criar tarefas que rodam sem sessão exige privilégio elevado.
- Os caminhos absolutos das pastas do servidor: onde está o
GameServer.exe, oConnectServer.exe, oJoinServer.exee a pasta de logs. Anote-os, você vai usá-los muito. - Uma noção de PowerShell básico. Não precisa ser especialista; os scripts abaixo são comentados e você adapta os caminhos.
- Espaço em disco reservado para backups e uma política de retenção definida (quantos dias guardar). Automação sem retenção enche o disco e derruba o servidor — o oposto do que você queria.
D:\Scripts\ no servidor e guarde todos os seus scripts de automação lá. Ter tudo num lugar só facilita backup, versionamento e a hora de passar o servidor para outro admin.O que vale a pena automatizar num servidor de MU
Nem toda tarefa deve ser automatizada, e nem todo horário é adequado. A tabela abaixo lista as automações mais comuns em servidores de MU, com a frequência típica e o horário sugerido. Os valores são exemplo e variam por provedor/versão e pelo perfil de jogadores do seu servidor.
| Tarefa | Frequência típica | Horário sugerido | Gatilho recomendado |
|---|---|---|---|
| Reinício do GameServer | Diária | 05:00 (menor pico) | Por horário |
| Backup do banco de dados | Diária + a cada 6h | 05:15 + intervalos | Por horário |
| Limpeza de logs antigos | Semanal | Domingo 04:00 | Por horário |
| Subir servidor após reboot | Sob demanda | — | Ao iniciar o sistema |
| Ligar evento sazonal | Sazonal | Conforme calendário | Por horário |
| Verificação de processo vivo | A cada 5 min | — | Por horário (repetição) |
A regra de ouro: automatize o que é repetitivo, previsível e de baixo risco. Reinício, backup e limpeza entram fácil. Já uma migração de banco ou uma atualização de versão do emulador não devem ser automatizadas — são operações que exigem olho humano e ponto de decisão.
Passo 1 — Escrever o script de reinício do GameServer
Antes de agendar, escreva o script. Uma tarefa agendada é só um gatilho; a inteligência está no script que ela dispara. Este exemplo em PowerShell para o reinício do GameServer, com aviso, verificação e log:
# Script: ReiniciarGameServer.ps1
# Reinicia o GameServer de forma controlada, com 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 do GameServer ==="
# 1 -> Encerra o processo atual, se estiver rodando
$proc = Get-Process -Name ($GameServerExe -replace '\.exe$','') -ErrorAction SilentlyContinue
if ($proc) {
Write-Log "GameServer rodando (PID $($proc.Id)). Encerrando..."
Stop-Process -Id $proc.Id -Force
Start-Sleep -Seconds 5
} else {
Write-Log "GameServer nao estava rodando."
}
# 2 -> Sobe o GameServer novamente
$exePath = Join-Path $GameServerDir $GameServerExe
if (Test-Path $exePath) {
Start-Process -FilePath $exePath -WorkingDirectory $GameServerDir
Write-Log "GameServer iniciado a partir de $exePath"
} else {
Write-Log "ERRO: executavel nao encontrado em $exePath"
exit 1
}
Write-Log "=== Reinicio concluido ==="
Repare em três detalhes que separam um script amador de um profissional: caminho absoluto (nunca relativo), o WorkingDirectory definido explicitamente (o MU depende de arquivos na pasta dele), e o log com data. Sem o log você fica cego quando algo falhar às 5h da manhã.
Start-Process funciona com a sessão aberta, mas ao fechar o RDP a janela pode encerrar dependendo da configuração. Teste o comportamento do seu emulador antes de confiar no reinício automático sem supervisão.Passo 2 — Criar a tarefa no Agendador (interface gráfica)
Com o script pronto, agende-o. Abra o Agendador de Tarefas (taskschd.msc) e siga:
- No painel direito, clique em Criar Tarefa (não "Criar Tarefa Básica" — a completa dá mais controle).
- Na aba Geral: dê o nome
MU_Reinicio_GameServer, marque Executar estando o usuário conectado ou não e Executar com privilégios mais altos. - Na aba Disparadores: novo disparador, Diariamente, horário 05:00.
- Na aba Ações: nova ação, Iniciar um programa. No campo Programa:
powershell.exe. Em Argumentos:-NonInteractive -ExecutionPolicy Bypass -File "D:\Scripts\ReiniciarGameServer.ps1". No campo Iniciar em:D:\Scripts\. - Na aba Condições: desmarque "Iniciar a tarefa somente se o computador estiver na energia CA" (VPS roda 24h).
- Na aba Configurações: marque "Executar a tarefa assim que possível após uma inicialização agendada ter sido perdida".
O campo Iniciar em da etapa 4 é o que mais gente esquece e o que mais causa a falha silenciosa: sem ele, o PowerShell roda a partir de System32 e qualquer caminho relativo quebra.
Passo 3 — Criar tarefas via linha de comando (schtasks)
Para automação em escala, ou para documentar a criação da tarefa num script de setup, use o schtasks. É o mesmo agendador, sem cliques:
# Cria a tarefa de reinicio diario as 05:00, rodando 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
# Cria tarefa que sobe todos os servidores ao iniciar o 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 as tarefas MU criadas
schtasks /Query /TN "MU_Reinicio_GameServer" /V /FO LIST
A tarefa MU_Subir_ServidoresBoot com /SC ONSTART é uma das mais valiosas: se o VPS reiniciar sozinho de madrugada (atualização forçada, queda de energia no datacenter), seus servidores voltam sozinhos, na ordem certa, sem você acordar.
Passo 4 — Script mestre que sobe os servidores na ordem correta
O MU tem ordem de inicialização: primeiro o banco de dados deve estar no ar, depois DataServer/ConnectServer, depois JoinServer, e por último os GameServers. Subir tudo de uma vez, fora de ordem, gera erros de conexão. Um script mestre resolve:
# Script: SubirTudo.ps1
# Sobe os componentes do MU na ordem correta, com espera entre eles.
$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 "ERRO: $nome nao encontrado em $p" }
}
Log "=== BOOT do servidor MU ==="
# 1 -> Aguarda o SQL Server ficar pronto (exemplo: espera fixa)
Log "Aguardando banco de dados..."
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 concluido ==="
Os tempos de espera (Start-Sleep) são exemplo e variam por provedor/versão e pelo hardware do VPS. Num servidor mais lento, aumente. O ideal, em vez de espera fixa, é checar se a porta do componente anterior já responde antes de subir o próximo — mas a espera fixa já resolve a maioria dos casos.
Passo 5 — Tarefa de vigilância (o servidor caiu, sobe de novo)
Uma tarefa que roda a cada poucos minutos e verifica se o GameServer está vivo transforma uma queda de madrugada num soluço de 3 minutos em vez de horas offline:
# Script: VigiaGameServer.ps1 - agende com repeticao a 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 caiu. Subindo..."
Start-Process "D:\MuServer\GameServer\GameServer.exe" -WorkingDirectory "D:\MuServer\GameServer"
}
Para agendar a repetição: na aba Disparadores, crie um disparador diário e, em "Configurações avançadas", marque Repetir a tarefa a cada 5 minutos por uma duração de "Indefinidamente".
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Tarefa "concluída" mas script não fez nada | Caminho relativo ou campo "Iniciar em" vazio | Use caminhos absolutos e preencha "Iniciar em" com a pasta do script |
| Código de resultado 0x1 no histórico | Erro dentro do script (arquivo não achado, permissão) | Abra o log do script; rode-o manualmente pelo mesmo usuário da tarefa |
| Tarefa não dispara no horário | Condição de energia CA marcada, ou fuso/hora do servidor errados | Desmarque condição de CA; confira o relógio do VPS |
| 0x41301 "em execução" travada | Instância anterior não encerrou | Marque "Parar a tarefa se rodar mais que X horas"; revise o script |
| Script roda no meu login mas não sem sessão | Precisa de sessão interativa (janela) | Mantenha sessão, ou rode o processo como serviço com ferramenta dedicada |
| ExecutionPolicy bloqueia o script | Política de execução restritiva | Use -ExecutionPolicy Bypass no argumento, como nos exemplos |
| Histórico da tarefa vazio | Histórico do Agendador desativado | No painel direito, clique em "Habilitar Histórico de Todas as Tarefas" |
O erro campeão é o primeiro da tabela. Sempre que uma tarefa "funcionar" mas nada acontecer, o primeiro reflexo deve ser: caminho absoluto? "Iniciar em" preenchido? Conta com permissão na pasta? Noventa por cento dos casos morrem aí.
Boas práticas de operação
Automação sem observabilidade é uma bomba-relógio. Três hábitos evitam a maioria dos desastres:
- Todo script escreve log com data e hora. Quando algo falha às 5h, o log é a única testemunha.
- Toda tarefa manda alerta em falha. Um
Send-MailMessageou um webhook de Discord no bloco de erro te avisa antes do jogador reclamar. - Revise o histórico semanalmente. Cinco minutos olhando os códigos de resultado das tarefas revelam problemas antes que virem quedas.
E teste cada tarefa manualmente antes de confiar nela: no Agendador, botão direito na tarefa, Executar. Se roda bem sob demanda mas falha no horário, o problema está no gatilho ou na conta — não no script.
Checklist de lançamento
- Caminhos absolutos de GameServer, ConnectServer, JoinServer e logs anotados
- Pasta
D:\Scripts\criada com todos os scripts versionados - Script de reinício testado manualmente e gerando log
- Tarefa de reinício diário criada, com "Iniciar em" preenchido
- Tarefa de boot (
ONSTART) subindo os servidores na ordem correta - Tarefa de backup agendada e integrada com a política de retenção
- Tarefa de vigilância a cada 5 min com contador de reinícios
- Condição de energia CA desmarcada em todas as tarefas
- "Executar assim que possível se perder o horário" marcado onde faz sentido
- Histórico do Agendador de Tarefas habilitado
- Alertas de falha (e-mail ou Discord) configurados nos scripts críticos
- Relógio e fuso horário do VPS conferidos
- Cada tarefa executada manualmente ("Executar") e validada antes do lançamento
Com essas tarefas no lugar, o seu servidor de MU passa a se cuidar sozinho na maior parte do tempo: reinicia limpo, faz backup, se levanta após um reboot e avisa quando algo dá errado. Você deixa de ser refém do "espero que ninguém precise de mim de madrugada" e ganha o bem mais escasso de quem administra servidor: sono.
Perguntas frequentes
O que é o Task Scheduler e por que usá-lo num servidor de MU?
O Task Scheduler (Agendador de Tarefas) é o serviço nativo do Windows que dispara programas e scripts em horários ou eventos definidos, sem intervenção humana. Num servidor de MU ele resolve o problema da disciplina: reiniciar o GameServer de madrugada, rodar backup, limpar logs e ligar eventos deixam de depender de você lembrar. Enquanto o servidor estiver ligado, a tarefa roda. É gratuito, já vem no Windows Server e não exige software extra.
Preciso deixar a sessão do Windows aberta para as tarefas rodarem?
Não, e essa é justamente a vantagem. Marque a opção Executar estando o usuário conectado ou não e a tarefa roda como serviço, mesmo com ninguém logado via RDP. O detalhe é que tarefas que abrem janela (como uma janela de console do GameServer que precisa ficar visível) exigem sessão interativa; para essas, ou você mantém a sessão, ou usa uma ferramenta que rode o processo como serviço. Varia por versão do Windows Server.
Por que minha tarefa aparece como concluída mas o script não fez nada?
Quase sempre é caminho relativo ou permissão. O Task Scheduler roda a tarefa a partir de uma pasta que não é a do seu script, então caminhos como .\\GameServer.exe falham silenciosamente; use sempre caminhos absolutos e preencha o campo Iniciar em. O outro motivo comum é a conta: se a tarefa roda como SYSTEM ou como um usuário sem acesso à pasta do MU, o script não consegue ler os arquivos. Verifique o código de resultado no histórico da tarefa.
Posso reiniciar o GameServer automaticamente sem derrubar jogadores no meio de um evento?
Pode, com cuidado. O ideal é agendar o reinício para o horário de menor movimento (madrugada) e enviar um aviso no jogo antes, se o seu emulador suportar broadcast por linha de comando. Um script bem feito checa se há um evento crítico em andamento (Castle Siege, por exemplo) e adia o reinício. Nunca agende reinício automático em cima do horário de eventos importantes; o remédio vira problema.
Qual a diferença entre agendar por horário e agendar por evento?
Agendar por horário dispara a tarefa num relógio (todo dia às 5h, por exemplo) e é o mais usado para backup e reinício. Agendar por evento dispara a tarefa quando algo acontece no Windows: ao iniciar o sistema, ao um serviço parar, ou quando um ID específico aparece no Log de Eventos. Para MU, o gatilho ao iniciar o sistema é ouro: garante que ConnectServer, JoinServer e GameServer subam sozinhos depois de um reboot inesperado do VPS.