Het ideale opstartscript voor de Minecraft-server

Het ideale opstartscript voor de Minecraft-server

De auteur houdt erg van het spel en hij is zelf de beheerder van een kleine server ‘puur voor vrienden’. Zoals gebruikelijk bij amateurs, wordt alles op de server aangepast, en dit brengt instabiliteit met zich mee en als gevolg daarvan crashes. Omdat de auteur van Powershell beter weet dan de locatie van de winkels in zijn straat, besloot hij om "Beste script om Minecraft 2020 te lanceren" Hetzelfde script diende als basis voor de sjabloon in Ruvds marktplaats. Maar alle bronnen staan ​​al in het artikel. Nu, in volgorde, hoe het allemaal werd gedaan.

De commando's die we nodig hebben

Alternatieve houtkap

Op een dag, nadat ik nog een paar mods had geïnstalleerd, ontdekte ik dat de server blijkbaar crashte zonder de oorlog te verklaren. De server schreef geen fouten in Latest.log of in debug, en de console, die in theorie deze fout had moeten schrijven en stoppen, was gesloten.

Als hij niet wil schrijven, hoeft hij dat ook niet te doen. We hebben Powershell met cmdlet Tee-object, die een object neemt en dit tegelijkertijd naar een bestand en naar de console uitvoert.

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

Op deze manier haalt Powershell de StandardOutput op en schrijft deze naar een bestand. Probeer niet te gebruiken Start-procesomdat het System.ComponentModel.Component retourneert en niet StandardOutput, en -RedirectStandardOutput het onmogelijk maakt om de console te betreden, wat we willen vermijden.

Lanceer argumenten

Na het installeren van datzelfde paar mods merkte de auteur dat de server ook niet genoeg RAM had. En dit vereist het veranderen van de lanceringsargumenten. In plaats van ze elke keer te veranderen in start.bat, wat iedereen gebruikt, kun je gewoon dit script gebruiken.

Omdat Tee-Object alleen StandardOutput leest als het uitvoerbare bestand "Just Like This" heet, zul je een ander script moeten maken. Dit script wordt door Minecraft zelf gelanceerd. Laten we beginnen met de argumenten.

Om in de toekomst te kunnen genieten van ultieme luiheid, moet het script meteen lanceringsargumenten verzamelen. Om dit te doen, gaan we eerst zoeken naar de nieuwste versie smeden.

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

Met behulp van sort-object nemen we altijd het object met het grootste aantal, ongeacht hoeveel u er plaatst. Ultieme luiheid.

Nu moet u geheugen aan de server toewijzen. Om dit te doen, neemt u de hoeveelheid systeemgeheugen en schrijft u de hoeveelheid ervan in een tekenreeks.

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

Correcte automatische herstart

De auteur heeft .bat-bestanden van andere mensen gezien, maar zij hielden geen rekening met de reden waarom de server werd gestopt. Dit is lastig. Wat als u alleen maar het mod-bestand wilt wijzigen of iets wilt verwijderen?
Laten we nu een goede herstart uitvoeren. De auteur kwam eerder vreemde scripts tegen die de server opnieuw opstartten, ongeacht de reden waarom de server werd afgesloten. We zullen exitcode gebruiken. Java gebruikt 0 als succes, dus we dansen vanaf hier.

Laten we eerst een functie maken die de server opnieuw opstart als deze mislukt.

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

Het script blijft in de lus totdat de server normaal wordt afgesloten vanaf zijn eigen console met behulp van de opdracht /stop.

Als we besluiten alles te automatiseren, dan zou het leuk zijn om de startdatum, opleverdatum en ook de reden van oplevering te verzamelen.

Om dit te doen, schrijven we het resultaat van Start-Process in een variabele. In het script ziet het er als volgt uit:

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

En dan schrijven we de resultaten naar een bestand. Dit is wat er in de variabele naar ons wordt teruggestuurd:

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

Dit alles kan via Add-Content aan een bestand worden toegevoegd. Nadat we het een beetje hebben uitgekamd, krijgen we dit script, en laten we het handler.ps1 noemen.

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

Laten we nu een script maken dat de handler start.

Correct opstarten

De auteur wil verschillende versies van Minecraft vanaf elk pad in één module uitvoeren en ook logs in een specifieke map kunnen opslaan.

Het probleem is dat het proces moet worden gestart door een gebruiker die is ingelogd op het systeem. Dit kan via de desktop of WinRm. Als u de server als systeemgebruiker of zelfs als beheerder uitvoert, maar niet inlogt, kan Server.jar niet eens eula.txt lezen en starten.

We kunnen automatisch inloggen inschakelen door drie vermeldingen aan het register toe te voegen.

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

Het is niet veilig. De login en het wachtwoord worden hier in platte tekst aangegeven, dus om de server te starten moet u een aparte gebruiker aanmaken die toegang heeft op gebruikersniveau, of in een nog smallere groep. Het wordt ten strengste afgeraden om hiervoor een standaardbeheerder te gebruiken.

We hebben de automatische login opgelost. Nu moet u een nieuwe taak voor de server registreren. We zullen de opdracht uitvoeren vanuit Powershell, dus het ziet er als volgt uit:

$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

Het assembleren van de module

Laten we nu alles in modules stoppen die later kunnen worden gebruikt. Alle code voor kant-en-klare scripts is hier, importeer en gebruik.

Je kunt alles hierboven beschreven afzonderlijk gebruiken als je geen zin hebt in modules.

Start-Minecraft

Laten we eerst een module maken die niets anders doet dan een script uitvoeren dat naar de standaarduitvoer luistert en deze opneemt.

In het parameterblok vraagt ​​hij vanuit welke map hij Minecraft moet starten en waar hij het logbestand moet plaatsen.

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

En je zult Minecraft als volgt moeten starten:

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

Laten we nu verder gaan met de kant-en-klare Handler.ps1

Om ervoor te zorgen dat ons script parameters accepteert wanneer het wordt aangeroepen, moeten we ook een parameterblok opgeven. Let op: het draait Oracle Java. Als u een andere distributie gebruikt, moet u het pad naar het uitvoerbare bestand wijzigen.

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

Het script is vrijwel hetzelfde als Start-Minecraft, behalve dat het alleen een nieuwe taak registreert. Accepteert dezelfde argumenten. Als de gebruikersnaam niet is opgegeven, wordt de huidige gebruikersnaam gebruikt.

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

Registreren-Autologon

In het parameterblok accepteert het script de parameters Gebruikersnaam en Wachtwoord. Als er geen gebruikersnaam is opgegeven, wordt de naam van de huidige gebruiker gebruikt.

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

Het uitvoeren van dit script ziet er als volgt uit:

Set-Autologon -Password "PlaintextPassword"

Hoe te gebruiken

Laten we nu eens kijken hoe de auteur dit allemaal zelf gebruikt. Hoe u een openbare Minecraft-server op de juiste manier op Windows kunt implementeren. Laten we vanaf het allereerste begin beginnen.

1. Maak een gebruiker aan

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

2. Registreer de taak om het script uit te voeren

U kunt zich registreren via een module als deze:

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

Of gebruik standaardhulpmiddelen:

$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. Schakel automatisch inloggen in en start de machine opnieuw op

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

Voltooiing

De auteur heeft het script gemaakt, ook voor zichzelf, daarom luistert hij graag naar uw suggesties om het script te verbeteren. De auteur hoopt dat al deze code op zijn minst minimaal nuttig voor u was, en dat het artikel interessant was.

Het ideale opstartscript voor de Minecraft-server

Bron: www.habr.com

Voeg een reactie