Die perfekte Minecraft-bediener opstartskrif

Die perfekte Minecraft-bediener opstartskrif

Die skrywer is baie lief vir die speletjie, en hy is self die administrateur van 'n klein bediener "suiwer vir vriende". Soos gewoonlik onder amateurs, is alles op die bediener aangepas, en dit behels onstabiliteit van werk en as gevolg daarvan 'n val. Aangesien die skrywer Powershell beter ken as die ligging van winkels op sy straat, het hy besluit om "Beste skrif om Minecraft 2020 te begin". Dieselfde skrif het gedien as die basis vir die sjabloon in Ruvds mark. Maar al die bronne is reeds in die artikel. Nou, in volgorde, hoe dit alles gedoen is.

Die opdragte wat ons nodig het

Alternatiewe aanteken

Sodra ek nog 'n paar mods geïnstalleer het, het ek gevind dat die bediener blykbaar val sonder om oorlog te verklaar. Die bediener het nie foute na latest.log of debug geskryf nie, en die konsole, wat in teorie veronderstel was om hierdie fout te skryf en te stop, is gesluit.

As jy nie wil skryf nie, moenie. Ons het Powershell met 'n cmdlet Tee-voorwerp, wat 'n voorwerp neem en dit terselfdertyd na 'n lêer en na die konsole uitvoer.

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

So Powershell sal die StandardOutput optel en dit na 'n lêer skryf. Moenie probeer gebruik nie Begin-proses, want dit sal 'n System.ComponentModel.Component terugstuur, nie 'n StandardOutput nie, en -RedirectStandardOutput sal dit onmoontlik maak om in die konsole in te tik, wat is wat ons wil vermy.

Begin Argumente

Nadat hy dieselfde paar mods geïnstalleer het, het die skrywer opgemerk dat die bediener ook nie genoeg RAM het nie. En dit is nodig om die bekendstellingsargumente te verander. In plaas daarvan om hulle elke keer te verander in start.bat, wat almal gebruik, gebruik net hierdie skrif.

Aangesien Tee-Object StandardOutput slegs lees wanneer die uitvoerbare "Net so" genoem word, sal nog een script gedoen moet word. Hierdie skrip sal minecraft self laat loop. Kom ons begin met die argumente.

Om in die toekoms te smul aan uiterste luiheid, moet die draaiboek loodsargumente op die vlieg versamel. Om dit te doen, kom ons begin deur na die nuutste weergawe te soek smee.

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

Met sort-object , sal ons altyd die voorwerp met die grootste getal neem, maak nie saak hoeveel jy daar plaas nie. Uiteindelike luiheid.

Nou moet ons geheue aan die bediener toewys. Om dit te doen, neem ons die hoeveelheid stelselgeheue en skryf die hoeveelheid daarvan in die string.

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

Behoorlike outomatiese herbegin

Die skrywer het .bat-lêers van ander mense gesien, maar hulle het nie die rede waarom die bediener gestop is, in ag geneem nie. Dit is ongerieflik, wat as jy net die mod-lêer moet verander of iets moet uitvee?
Kom ons doen nou 'n behoorlike herbegin. Die skrywer het voorheen vreemde skrifte afgekom wat die bediener herbegin het, ongeag hoekom die bediener verlaat het. Ons sal uitgangskode gebruik. Java gebruik 0 as sukses, so kom ons dans van daar af.

Laat ons eers 'n funksie skep wat die bediener sal herbegin as dit misluk.

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

Die skrip sal in die lus bly totdat die bediener normaalweg uit sy eie konsole gaan met die /stop-opdrag.

As ons besluit het om alles te outomatiseer, sou dit lekker wees om die datum van bekendstelling, einde, en ook die rede vir die einde in te samel.

Om dit te doen, skryf ons die resultaat van Start-Process na 'n veranderlike. In 'n draaiboek lyk dit so:

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

En skryf dan die resultate in 'n lêer. Hier is wat in 'n veranderlike aan ons teruggegee word:

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

Dit alles kan met Add-Content by die lêer gevoeg word. Nadat ons 'n bietjie geborsel het, kry ons so 'n skrif, maar ons noem dit 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

Kom ons ontwerp nou die skrif met die bekendstelling van die hanteerder.

Behoorlike outolaai

Die skrywer wil minecraft van verskillende weergawes vanaf enige pad met een module laat loop, en ook logs in 'n spesifieke vouer kan plaas.

Die probleem is dat die proses begin moet word deur 'n gebruiker wat aangemeld is. Dit kan gedoen word deur die lessenaar of WinRm. As jy die bediener as 'n stelsel of selfs 'n administrateur laat loop, maar nie aanmeld nie, dan sal Server.jar nie eers eula.txt kan lees en begin nie.

Ons kan outologon aktiveer deur drie inskrywings by die register te voeg.

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

Dit is nie veilig nie. Die login en wagwoord word hier deur die gewone teks aangedui, dus, om die bediener te begin, moet jy 'n aparte gebruiker skep wat toegang het op die gebruikersvlak, of in 'n selfs nouer groep. Die gebruik van die standaard administrateur hiervoor word ten sterkste afgeraai.

Ons het die outologin uitgepluis. Nou moet jy 'n nuwe taak vir die bediener registreer. Ons sal die opdrag vanaf Powershell uitvoer, so dit sal soos volg lyk:

$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

Die samestelling van die module

Kom ons rangskik nou alles in modules wat later gebruik kan word. Alle kode van klaargemaakte skrifte is hier, invoer en gebruik.

Jy kan alles wat hierbo beskryf word afsonderlik gebruik as jy jou nie met modules wil steur nie.

begin minecraft

Kom ons maak eers 'n module wat niks anders sal doen as om 'n skrif uit te voer wat sal luister en na standaardafvoer skryf nie.

In die parameterblok vra hy uit watter gids om minecraft te begin en waar om die log te plaas.

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 jy sal minecraft soos volg moet laat loop:

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

Kom ons gaan nou aan na die gereed-vir-gebruik Handler.ps1

Om te verseker dat ons skrip parameters kan aanvaar wanneer dit opgeroep word, moet ons ook 'n parameterblok spesifiseer. Neem asseblief kennis dat dit Oracle Java loop, as jy 'n ander verspreiding gebruik, sal jy die pad na die uitvoerbare lêer moet verander.

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

registreer minecraft

Die skrif is feitlik dieselfde as Start-Minecraft, behalwe dat dit net 'n nuwe taak registreer. Aanvaar dieselfde argumente. Die gebruikersnaam, indien nie gespesifiseer nie, neem die huidige een.

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

Registreer-outologon

In die parameterblok aanvaar die skrip die Gebruikersnaam- en Wagwoordparameters. As Gebruikersnaam nie gespesifiseer is nie, word die huidige gebruiker se naam gebruik.

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

Die uitvoering van hierdie skrip lyk soos volg:

Set-Autologon -Password "PlaintextPassword"

Hoe om te gebruik

Dink nou aan hoe die skrywer dit alles self gebruik. Hoe om 'n Minecraft-openbare bediener op Windows behoorlik te ontplooi. Kom ons begin van die begin af.

1. Skep 'n gebruiker

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

2. Registreer die taak om die skrip te laat loop

Jy kan registreer met 'n module soos so:

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

Of gebruik die standaard gereedskap:

$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. Skakel outologin aan en herlaai die masjien

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

Voltooiing

Die skrywer het die draaiboek gemaak, insluitend vir homself, daarom sal hy graag luister na jou voorstelle om die draaiboek te verbeter. Die skrywer hoop dat al hierdie kode ten minste minimaal nuttig vir jou was, en die artikel is interessant.

Die perfekte Minecraft-bediener opstartskrif

Bron: will.com

Voeg 'n opmerking