Idealus Minecraft serverio paleidimo scenarijus

Idealus Minecraft serverio paleidimo scenarijus

Autorius labai mėgsta žaidimą, o jis pats yra mažo serverio administratorius „tik draugams“. Kaip įprasta tarp mėgėjų, viskas serveryje yra modifikuojama, o tai sukelia nestabilumą ir dėl to strigimus. Kadangi „Powershell“ autorius žino geriau nei parduotuvių vietą savo gatvėje, jis nusprendė padaryti „Geriausias scenarijus paleisti „Minecraft 2020“.“ Tas pats scenarijus buvo šablono pagrindas Ruvds turgus. Bet visi šaltiniai jau yra straipsnyje. Dabar eilės tvarka, kaip viskas buvo padaryta.

Mums reikalingos komandos

Alternatyvus registravimas

Vieną dieną, įdiegęs dar keletą modifikacijų, sužinojau, kad serveris, matyt, sugenda nepaskelbus karo. Serveris nerašė klaidų į latest.log ar in debug, o konsolė, kuri teoriškai turėjo parašyti šią klaidą ir sustoti, buvo uždaryta.

Jei jis nenori rašyti, jam to nereikia. Mes turime Powershell su cmdlet Tee-Object, kuris paima objektą ir vienu metu išveda jį į failą ir į konsolę.

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

Tokiu būdu „Powershell“ pasiims standartinę išvestį ir įrašys ją į failą. Nebandykite naudoti Pradėti-Procesasnes jis grąžins System.ComponentModel.Component, o ne StandardOutput, o -RedirectStandardOutput neleis patekti į konsolę, ko norime išvengti.

Pradėti argumentus

Įdiegęs tą pačią modifikacijų porą, autorius pastebėjo, kad serveris taip pat neturi pakankamai RAM. O tam reikia pakeisti paleidimo argumentus. Užuot kiekvieną kartą juos keisdami start.bat, kurį naudoja visi, tiesiog naudokite šį scenarijų.

Kadangi „Tee-Object“ skaito „StandardOutput“ tik tada, kai vykdomasis failas vadinamas „Just Like This“, turėsite sukurti kitą scenarijų. Šį scenarijų paleis pats „Minecraft“. Pradėkime nuo argumentų.

Kad ateityje galėtumėte pasinerti į didžiausią tinginystę, scenarijus turi rinkti paleidimo argumentus. Norėdami tai padaryti, pradėkime nuo naujausios versijos paieškos kalvė.

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

Naudodami rūšiavimo objektą, mes visada paimsime didžiausią skaičių turintį objektą, nesvarbu, kiek jų ten įdėsite. Galutinė tinginystė.

Dabar reikia priskirti atmintį serveriui. Norėdami tai padaryti, paimkite sistemos atminties kiekį ir įveskite jo kiekį eilutėje.

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

Teisingas automatinis paleidimas iš naujo

Autorius matė .bat failus iš kitų žmonių, tačiau jie neatsižvelgė į priežastį, kodėl serveris buvo sustabdytas. Tai nepatogu, o jei jums tiesiog reikia pakeisti mod failą arba ką nors ištrinti?
Dabar atlikime tinkamą paleidimą iš naujo. Autorius anksčiau susidūrė su keistais scenarijais, kurie iš naujo paleido serverį, nepaisant to, kodėl serveris išsijungė. Mes naudosime išėjimo kodą. „Java“ sėkmingai naudoja 0, todėl šoksime nuo čia.

Pirmiausia sukurkime funkciją, kuri iš naujo paleis serverį, jei nepavyks.

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

Scenarijus liks cikle, kol serveris normaliai išsijungs iš savo konsolės, naudodamas komandą /stop.

Jei nuspręstume viską automatizuoti, būtų malonu surinkti pradžios datą, užbaigimo datą ir užbaigimo priežastį.

Norėdami tai padaryti, paleidimo proceso rezultatą įrašome į kintamąjį. Scenarijuje jis atrodo taip:

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

Tada rezultatus įrašome į failą. Štai kas mums grąžinama kintamuoju:

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

Visa tai galima pridėti prie failo naudojant Add-Content. Šiek tiek sušukę gauname šį scenarijų ir pavadinkime jį 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

Dabar sukurkime scenarijų, kuris paleidžia tvarkyklę.

Teisingas paleidimas

Autorius nori paleisti skirtingas Minecraft versijas iš bet kurio kelio viename modulyje, taip pat turėti galimybę laikyti žurnalus konkrečiame aplanke.

Problema ta, kad procesą turi pradėti vartotojas, kuris yra prisijungęs prie sistemos. Tai galima padaryti naudojant darbalaukį arba WinRm. Jei paleisite serverį kaip sistemos vartotojas ar net administratorius, bet neprisijungsite, tada Server.jar net negalės perskaityti eula.txt ir paleisti.

Automatinį prisijungimą galime įjungti įtraukę tris įrašus į registrą.

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

Tai nesaugu. Prisijungimo vardas ir slaptažodis čia nurodomi paprastu tekstu, todėl norint paleisti serverį reikia sukurti atskirą vartotoją, kuris turi prieigą vartotojo lygiu arba dar siauresnėje grupėje. Tam griežtai nerekomenduojama naudoti standartinio administratoriaus.

Sutvarkėme automatinį prisijungimą. Dabar reikia užregistruoti naują užduotį serveriui. Mes vykdysime komandą iš Powershell, todėl ji atrodys taip:

$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

Modulio surinkimas

Dabar viską sudėkime į modulius, kuriuos bus galima naudoti vėliau. Visas paruoštų scenarijų kodas yra čia, importuokite ir naudokite.

Galite naudoti viską, kas aprašyta aukščiau, atskirai, jei nenorite vargti su moduliais.

Pradėti - Minecraft

Pirmiausia sukurkime modulį, kuris nieko daugiau nedarys, tik paleis scenarijų, kuris klausys ir įrašys standartinę išvestį.

Parametrų bloke jis klausia, iš kurio aplanko paleisti „Minecraft“ ir kur dėti žurnalą.

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

Ir jums reikės paleisti „Minecraft“ taip:

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

Dabar pereikime prie paruošto naudoti Handler.ps1

Kad mūsų scenarijus priimtų parametrus, kai jis iškviečiamas, taip pat turime nurodyti parametrų bloką. Atminkite, kad jame veikia „Oracle Java“, jei naudojate kitą platinimą, turėsite pakeisti vykdomojo failo kelią.

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

Registracija - Minecraft

Scenarijus praktiškai nesiskiria nuo „Start-Minecraft“, tik registruoja tik naują užduotį. Priima tuos pačius argumentus. Vartotojo vardas, jei nenurodytas, paima dabartinį.

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-Autologon

Parametrų bloke scenarijus priima vartotojo vardo ir slaptažodžio parametrus. Jei vartotojo vardas nenurodytas, naudojamas dabartinio vartotojo vardas.

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

Šio scenarijaus vykdymas atrodo taip:

Set-Autologon -Password "PlaintextPassword"

Kaip naudotis

Dabar pažiūrėkime, kaip visa tai naudoja pats autorius. Kaip tinkamai įdiegti viešąjį „Minecraft“ serverį sistemoje „Windows“. Pradėkime nuo pat pradžių.

1. Sukurkite vartotoją

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

2. Užregistruokite užduotį, kad paleistumėte scenarijų

Registruotis galite naudodami tokį modulį:

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

Arba naudokite standartinius įrankius:

$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. Įjunkite automatinį prisijungimą ir paleiskite įrenginį iš naujo

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

Užbaigimas

Scenarijų sukūrė autorius, taip pat ir sau, todėl mielai išklausys jūsų pasiūlymus, kaip patobulinti scenarijų. Autorius tikisi, kad visas šis kodas bent minimaliai jums buvo naudingas, o straipsnis buvo įdomus.

Idealus Minecraft serverio paleidimo scenarijus

Šaltinis: www.habr.com

Добавить комментарий