Ideálny spúšťací skript servera Minecraft

Ideálny spúšťací skript servera Minecraft

Autor hru veľmi miluje a sám je správcom malého servera „čisto pre priateľov“. Ako je obvyklé medzi amatérmi, všetko na serveri je modifikované, čo spôsobuje nestabilitu a v dôsledku toho pády. Keďže autor Powershell vie lepšie ako umiestnenie obchodov na svojej ulici, rozhodol sa urobiť „Najlepší skript na spustenie Minecraftu 2020" Rovnaký skript slúžil ako základ pre šablónu v Trhovisko Ruvds. Ale všetky zdroje sú už v článku. Teraz po poriadku, ako sa to všetko urobilo.

Príkazy, ktoré potrebujeme

Alternatívna ťažba dreva

Jedného dňa, po inštalácii niekoľkých ďalších modov, som zistil, že server zjavne padá bez vyhlásenia vojny. Server nezapísal chyby do last.log ani do ladenia a konzola, ktorá mala teoreticky túto chybu zapísať a zastaviť, bola zatvorená.

Ak nechce písať, nemusí. Máme Powershell s cmdlet Tee-Object, ktorý vezme objekt a zároveň ho odošle do súboru a do konzoly.

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

Týmto spôsobom Powershell vyberie StandardOutput a zapíše ho do súboru. Nepokúšajte sa použiť Štart-Procespretože vráti System.ComponentModel.Component a nie StandardOutput a -RedirectStandardOutput znemožní vstup do konzoly, čomu sa chceme vyhnúť.

Spustite argumenty

Po inštalácii toho istého páru modov si autor všimol, že server tiež nemá dostatok pamäte RAM. A to si vyžaduje zmenu argumentov spustenia. Namiesto toho, aby ste ich zakaždým menili v start.bat, ktorý každý používa, stačí použiť tento skript.

Keďže Tee-Object číta StandardOutput iba vtedy, keď sa spustiteľný súbor nazýva "Just Like This", budete musieť vytvoriť ďalší skript. Tento skript spustí samotný Minecraft. Začnime s argumentmi.

Aby si scenár mohol v budúcnosti dopriať ultimátne leňošenie, musí za chodu zbierať argumenty na spustenie. Ak to chcete urobiť, začnime hľadaním najnovšej verzie vytvoriť.

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

Pomocou sort-object vždy zoberieme objekt s najväčším číslom, bez ohľadu na to, koľko ich tam vložíte. Konečná lenivosť.

Teraz musíte serveru priradiť pamäť. Ak to chcete urobiť, vezmite množstvo systémovej pamäte a zapíšte jej množstvo do reťazca.

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

Opravte automatický reštart

Autor videl súbory .bat od iných ľudí, ale nezohľadnili dôvod, prečo bol server zastavený. Je to nepohodlné, čo ak potrebujete zmeniť súbor mod alebo niečo odstrániť?
Teraz urobme poriadny reštart. Autor predtým narazil na podivné skripty, ktoré reštartovali server bez ohľadu na to, prečo sa server vypol. Použijeme výstupný kód. Java používa 0 ako úspech, takže budeme tancovať odtiaľto.

Najprv vytvorte funkciu, ktorá reštartuje server, ak zlyhá.

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

Skript zostane v slučke, kým sa server nevypne normálne zo svojej vlastnej konzoly pomocou príkazu /stop.

Ak sa rozhodneme všetko zautomatizovať, potom by bolo fajn zhromaždiť dátum začiatku, dátum dokončenia a tiež dôvod dokončenia.

Za týmto účelom zapíšeme výsledok Start-Process do premennej. V skripte to vyzerá takto:

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

A potom zapíšeme výsledky do súboru. Toto sa nám vráti v premennej:

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

To všetko je možné pridať do súboru pomocou Add-Content. Keď sme to trochu učesali, dostali sme tento skript a nazvime ho 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

Teraz vytvoríme skript, ktorý spustí handler.

Správne spustenie

Autor chce spustiť rôzne verzie Minecraftu z akejkoľvek cesty v jednom module a tiež mať možnosť ukladať protokoly do konkrétneho priečinka.

Problém je v tom, že proces musí spustiť užívateľ, ktorý je prihlásený do systému. To je možné vykonať prostredníctvom pracovnej plochy alebo WinRm. Ak server spúšťate ako systémový používateľ alebo dokonca správca, ale neprihlásite sa, Server.jar nebude môcť ani prečítať eula.txt a spustiť sa.

Automatické prihlásenie môžeme povoliť pridaním troch záznamov do registra.

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

Nie je to bezpečné. Prihlasovacie meno a heslo sú tu uvedené ako obyčajný text, takže na spustenie servera je potrebné vytvoriť samostatného používateľa, ktorý má prístup na úrovni používateľa alebo v ešte užšej skupine. Dôrazne sa neodporúča používať na to štandardného správcu.

Vyriešili sme automatické prihlasovanie. Teraz musíte zaregistrovať novú úlohu pre server. Spustíme príkaz z Powershell, takže bude vyzerať takto:

$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

Zostavenie modulu

Teraz poďme všetko do modulov, ktoré sa dajú použiť neskôr. Všetok kód pre hotové skripty je tu, importujte a používajte.

Všetko opísané vyššie môžete použiť samostatne, ak sa nechcete obťažovať modulmi.

Štart - Minecraft

Najprv vytvorme modul, ktorý nebude robiť nič iné, len spustiť skript, ktorý bude počúvať a zaznamenávať štandardný výstup.

V bloku parametrov sa pýta, z ktorého priečinka spustiť Minecraft a kam vložiť denník.

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

A budete musieť spustiť Minecraft takto:

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

Teraz prejdime na pripravený Handler.ps1

Aby náš skript pri volaní akceptoval parametre, musíme zadať aj blok parametrov. Upozorňujeme, že beží Oracle Java, ak používate inú distribúciu, budete musieť zmeniť cestu k spustiteľnému súboru.

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

Registrácia - Minecraft

Skript je prakticky rovnaký ako Start-Minecraft, ibaže registruje novú úlohu. Prijíma rovnaké argumenty. Používateľské meno, ak nie je zadané, preberá aktuálne.

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

Registrácia - Automatické prihlásenie

V bloku parametrov skript akceptuje parametre Používateľské meno a Heslo. Ak nebolo zadané meno používateľa, použije sa meno aktuálneho používateľa.

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."
 
}

Spustenie tohto skriptu vyzerá takto:

Set-Autologon -Password "PlaintextPassword"

Ako používať

Teraz sa pozrime na to, ako toto všetko využíva samotný autor. Ako správne nasadiť verejný server Minecraft v systéme Windows. Začnime od úplného začiatku.

1. Vytvorte používateľa

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

2. Zaregistrujte úlohu na spustenie skriptu

Môžete sa zaregistrovať pomocou modulu, ako je tento:

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

Alebo použite štandardné nástroje:

$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. Povoľte automatické prihlásenie a reštartujte počítač

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

Завершение

Autor vytvoril scenár aj pre seba, preto si rád vypočuje vaše návrhy na zlepšenie scenára. Autor dúfa, že celý tento kód bol pre vás aspoň minimálne užitočný a že článok bol zaujímavý.

Ideálny spúšťací skript servera Minecraft

Zdroj: hab.com

Pridať komentár