Idealna skripta za pokretanje Minecraft servera

Idealna skripta za pokretanje Minecraft servera

Autor veoma voli igru, a i sam je administrator malog servera „čisto za prijatelje“. Kao što je uobičajeno među amaterima, sve na serveru je modifikovano, a to povlači nestabilnost i, kao rezultat, padove. Pošto autor Powershell-a zna bolje od lokacije prodavnica u svojoj ulici, odlučio je da napravi "Najbolja skripta za pokretanje Minecrafta 2020" Ista skripta je poslužila kao osnova za šablon u Ruvds marketplace. Ali svi izvori su već u članku. Sada, redom, kako je to sve urađeno.

Komande koje su nam potrebne

Alternativno sečenje

Jednog dana, nakon što sam instalirao još nekoliko modova, otkrio sam da se server, očigledno, ruši bez objave rata. Server nije pisao greške u latest.log ili u debug, a konzola koja je u teoriji trebala napisati ovu grešku i zaustaviti je zatvorena.

Ako ne želi da piše, ne mora. Imamo Powershell sa cmdlet-om Tee-Object, koji uzima objekt i istovremeno ga šalje u datoteku i na konzolu.

.handler.ps1 | Tee-Object .StandardOutput.txt -Append

Na ovaj način, Powershell će pokupiti StandardOutput i zapisati ga u datoteku. Ne pokušavajte da koristite Start-Procesjer će vratiti System.ComponentModel.Component umjesto StandardOutput, a -RedirectStandardOutput će onemogućiti ulazak u konzolu, što želimo izbjeći.

Pokrenite argumente

Nakon instaliranja tog istog para modova, autor je primijetio da server također nema dovoljno RAM-a. A to zahtijeva promjenu argumenata pokretanja. Umjesto da ih svaki put mijenjate u start.batu, koji svi koriste, samo koristite ovu skriptu.

Budući da Tee-Object čita samo StandardOutput kada se izvršni fajl zove "Just Like This", moraćete da napravite drugu skriptu. Ovu skriptu će pokrenuti sam Minecraft. Počnimo sa argumentima.

Da bi se prepustio krajnjoj lijenosti u budućnosti, skripta mora prikupljati argumente za pokretanje u hodu. Da bismo to učinili, počnimo s traženjem najnovije verzije forge.

$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1

Koristeći sort-object, uvijek ćemo uzeti objekat sa najvećim brojem, bez obzira koliko ih tamo stavite. Krajnja lijenost.

Sada morate dodijeliti memoriju serveru. Da biste to učinili, uzmite količinu sistemske memorije i upišite njenu količinu u niz.

$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"

Ispravno automatsko ponovno pokretanje

Autor je vidio .bat fajlove od drugih ljudi, ali oni nisu uzeli u obzir razlog zašto je server zaustavljen. Ovo je nezgodno, šta ako samo trebate promijeniti mod datoteku ili nešto izbrisati?
Sada napravimo ispravan restart. Autor je ranije naišao na čudne skripte koje su restartovale server bez obzira zašto se server isključio. Koristićemo izlazni kod. Java koristi 0 kao uspjeh, tako da ćemo plesati odavde.

Prvo, napravimo funkciju koja će ponovo pokrenuti server ako ne uspije.

function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Write-Log
            Restart-Minecraft
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}

Skripta će ostati u petlji sve dok se server normalno ne isključi sa svoje konzole koristeći /stop komandu.

Ako se odlučimo sve automatizirati, onda bi bilo lijepo prikupiti datum početka, datum završetka, kao i razlog završetka.

Da bismo to učinili, rezultat pokretanja procesa upisujemo u varijablu. U skripti to izgleda ovako:

$global:Process = Start-Process -FilePath  "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru

I onda zapisujemo rezultate u datoteku. Ovo je ono što nam se vraća u varijabli:

$global:Process.StartTime
$global:Process.ExitCode	
$global:Process.ExitTime

Sve ovo se može dodati u fajl koristeći Add-Content. Nakon što smo je malo pročešljali, dobili smo ovu skriptu, i nazovimo je handler.ps1.

Add-Content -Value "Start time:" -Path $Logfile 
$global:Process.StartTime
 
Add-Content -Value "Exit code:" -Path $Logfile 
$global:Process.ExitCode | Add-Content $Logfile
    
Add-Content -Value "Exit time:" -Path $Logfile 
$global:Process.ExitTime | Add-Content $Logfile

Sada kreirajmo skriptu koja pokreće obrađivač.

Ispravno pokretanje

Autor želi pokrenuti različite verzije Minecraft-a s bilo koje staze u jednom modulu, a također može pohraniti zapise u određenu mapu.

Problem je što proces mora pokrenuti korisnik koji je prijavljen na sistem. Ovo se može uraditi preko desktopa ili WinRm-a. Ako pokrenete server kao sistemski korisnik ili čak administrator, ali se ne prijavite, tada Server.jar neće moći ni da pročita eula.txt i pokrene.

Možemo omogućiti automatsku prijavu dodavanjem tri unosa u registar.

New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password  -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1 -ErrorAction SilentlyContinue

Nije sigurno. Prijava i lozinka su ovdje navedeni u otvorenom tekstu, tako da je za pokretanje servera potrebno kreirati posebnog korisnika koji ima pristup na nivou korisnika, ili u još užoj grupi. Strogo se ne preporučuje korištenje standardnog administratora za ovo.

Sredili smo automatsku prijavu. Sada morate registrirati novi zadatak za server. Pokrenut ćemo naredbu iz Powershell-a, tako da će izgledati ovako:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

Sastavljanje modula

Sada stavimo sve u module koji se kasnije mogu koristiti. Sav kod za gotove skripte je ovdje, uvezite i koristite.

Sve što je gore opisano možete koristiti zasebno ako se ne želite mučiti s modulima.

Start-Minecraft

Prvo, napravimo modul koji neće raditi ništa više od pokretanja skripte koja će slušati i snimati standardni izlaz.

U bloku parametara pita iz koje mape da pokrene Minecraft i gdje da stavi dnevnik.

Set-Location (Split-Path $MyInvocation.MyCommand.Path)
function Start-Minecraft {
    [CmdletBinding()]
    param (
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]
        $LogFile,
 
        [Parameter(Mandatory)]  
        [ValidateSet('Vanilla', 'Forge')]
        [ValidateNotNullOrEmpty()]
        [string]
        $Type,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $MinecraftPath
 
    )
    powershell.exe -file .handler.ps1 -type $type -MinecraftPath $MinecraftPath | Tee-Object $LogFile -Append
}
Export-ModuleMember -Function Start-Minecraft

I morat ćete pokrenuti Minecraft na sljedeći način:

Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"

Sada pređimo na Handler.ps1 spreman za upotrebu

Da bi naša skripta prihvatila parametre kada je pozvana, također moramo navesti blok parametara. Imajte na umu da pokreće Oracle Java, ako koristite drugu distribuciju, morat ćete promijeniti putanju do izvršne datoteke.

param (
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$type,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$MinecraftPath,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$StandardOutput
)
 
Set-Location $MinecraftPath
 
function Restart-Minecraft {
 
    Write-host "=============== Starting godlike game server ============"
 
    $forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -first 1
 
    $ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
    $xmx = "-Xms" + $ram + "G"
    $global:Process = Start-Process -FilePath  "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
    
}
 
function Write-Log {
    Write-host "Start time:" $global:Process.StartTime
 
    Write-host "Exit code:" $global:Process.ExitCode
    
    Write-host "Exit time:" $global:Process.ExitTime
 
    Write-host "=============== Stopped godlike game server ============="
}
 
function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Restart-Minecraft
            Write-Log
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}
 
Get-MinecraftExitCode

Register-Minecraft

Skripta je praktično ista kao Start-Minecraft, osim što samo registruje novi zadatak. Prihvata iste argumente. Korisničko ime, ako nije navedeno, uzima trenutno.

function Register-Minecraft {
    [CmdletBinding()]
    param (
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]
        $LogFile,
 
        [Parameter(Mandatory)]  
        [ValidateSet('Vanilla', 'Forge')]
        [ValidateNotNullOrEmpty()]
        [string]$Type,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$MinecraftPath,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$User,
 
        [Parameter(Mandatory)]
        [string]$TaskName = $env:USERNAME
    )
 
    $Trigger = New-ScheduledTaskTrigger -AtLogOn
    $arguments = "Start-Minecraft -Type $Type -LogFile $LogFile -MinecraftPath $MinecraftPath"
    $PS = New-ScheduledTaskAction -Execute "PowerShell" -Argument "-noexit -command $arguments"
    Register-ScheduledTask -TaskName $TaskName -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
    
}
 
Export-ModuleMember -Function Register-Minecraft

Registracija-Auto-prijava

U bloku parametara, skripta prihvata parametre Korisničko ime i Lozinka. Ako Korisničko ime nije navedeno, koristi se ime trenutnog korisnika.

function Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage="Username for autologon")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="User password")]
        [ValidateNotNullOrEmpty()]
        $Password
    )
 
    $i = Get-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon"
 
    if ($null -eq $i) {
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password 
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1
        Write-Verbose "Set-Autologon will enable user auto logon."
 
    }
    else {
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1
    }
 
    
    Write-Verbose "Autologon was set successfully."
 
}

Pokretanje ove skripte izgleda ovako:

Set-Autologon -Password "PlaintextPassword"

Kako koristiti

Pogledajmo sada kako sam autor sve ovo koristi. Kako pravilno postaviti javni Minecraft server na Windows. Počnimo od samog početka.

1. Kreirajte korisnika

$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword

2. Registrirajte zadatak za pokretanje skripte

Možete se registrovati pomoću modula poput ovog:

Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"

Ili koristite standardne alate:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

3. Omogućite automatsku prijavu i ponovo pokrenite mašinu

Set-Autologon -Username "MinecraftServer" -Password "Qw3"

Završetak

Autor je napravio scenario, uključujući i za sebe, stoga će rado saslušati vaše predloge za poboljšanje scenarija. Autor se nada da vam je sav ovaj kod bio barem minimalno koristan, te da je članak bio zanimljiv.

Idealna skripta za pokretanje Minecraft servera

izvor: www.habr.com

Dodajte komentar