Täiuslik Minecrafti serveri käivitusskript

Täiuslik Minecrafti serveri käivitusskript

Autorile meeldib mäng väga ja ta ise on väikese serveri administraator “puhtalt sõprade jaoks”. Nagu amatööride seas tavaks, on serveris kõike modifitseeritud ja sellega kaasneb töö ebastabiilsus ja selle tulemusena kukkumine. Kuna autor teab Powershelli paremini kui kaupluste asukohta tema tänaval, otsustas ta teha "Parim skript Minecraft 2020 käivitamiseks". Sama skript oli malli aluseks Ruvdsi turg. Kuid kõik allikad on juba artiklis. Nüüd järjekorras, kuidas seda kõike tehti.

Käsklused, mida vajame

Alternatiivne metsaraie

Kui installisin veel paar modifikatsiooni, avastasin, et server kukkus ilmselt sõda välja kuulutamata. Server ei kirjutanud faili latest.log ega silumisvigu ning konsool, mis teoreetiliselt pidi selle vea kirjutama ja peatuma, suleti.

Kui sa ei taha kirjutada, siis ära kirjuta. Meil on cmdletiga Powershell Tee-Objekt, mis võtab objekti ja väljastab selle samaaegselt faili ja konsooli.

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

Seega valib Powershell standardväljundi ja kirjutab selle faili. Ärge proovige kasutada Start-Protsess, sest see tagastab System.ComponentModel.Component, mitte StandardOutput ja -RedirectStandardOutput muudavad konsooli tippimise võimatuks, mida me tahame vältida.

Käivitage argumendid

Pärast sama modifikatsioonipaari installimist märkas autor, et serveril pole ka piisavalt RAM-i. Ja käivitusargumente on vaja muuta. Selle asemel, et muuta neid iga kord failis start.bat, mida kõik kasutavad, kasutage lihtsalt seda skripti.

Kuna Tee-Object loeb StandardOutput ainult siis, kui käivitatava faili nimi on "Just niimoodi", tuleb teha veel üks skript. See skript käivitab minecrafti ise. Alustame argumentidega.

Et tulevikus ülimat laiskust endale lubada, peab skript koguma käigult käivitusargumente. Selleks alustame uusima versiooni otsimisega võltsima.

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

Sorteerimisobjekti puhul võtame alati suurima arvuga objekti, olenemata sellest, kui palju te sinna panete. Ülim laiskus.

Nüüd peame serverile mälu määrama. Selleks võtame süsteemimälu mahu ja kirjutame selle hulga stringi.

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

Õige automaatne taaskäivitamine

Autor on näinud .bat-faile teistelt inimestelt, kuid nad ei võtnud arvesse põhjust, miks server peatati. See on ebamugav, mis siis, kui peate lihtsalt mod-faili muutma või midagi kustutama?
Nüüd teeme korraliku taaskäivituse. Autor puutus varem kokku kummaliste skriptidega, mis taaskäivitasid serveri olenemata sellest, miks server väljus. Kasutame väljumiskoodi. Java kasutab eduna 0, nii et tantsime sealt edasi.

Kõigepealt loome funktsiooni, mis tõrke korral taaskäivitab serveri.

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

Skript jääb tsüklisse seni, kuni server väljub tavapäraselt oma konsoolist, kasutades käsku /stop.

Kui otsustaksime kõik automatiseerida, oleks tore koguda käivitamise kuupäev, lõpp ja ka lõpetamise põhjus.

Selleks kirjutame Start-Processi tulemuse muutujasse. Skriptis näeb see välja järgmine:

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

Ja seejärel kirjutage tulemused faili. Siin on see, mis meile muutujana tagastatakse:

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

Kõike seda saab faili lisada kasutades Add-Content. Pärast veidi pintseldamist saame sellise skripti, kuid nimetame seda 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

Nüüd kujundame skripti koos käitleja käivitamisega.

Õige automaatne laadimine

Autor soovib ühe mooduliga käivitada erinevate versioonide minecrafti mis tahes teelt ja ka logid konkreetsesse kausta panna.

Probleem on selles, et protsessi peab käivitama kasutaja, kes on sisse logitud. Seda saab teha töölaua või WinRmi kaudu. Kui käivitate serveri süsteemi või isegi administraatorina, kuid ei logi sisse, siis ei saa Server.jar isegi faili eula.txt lugeda ja käivitada.

Automaatset sisselogimist saame lubada, lisades registrisse kolm kirjet.

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

See ei ole ohutu. Sisselogimine ja parool on siin tähistatud tavatekstiga, seetõttu tuleb serveri käivitamiseks luua eraldi kasutaja, kellel on juurdepääs kasutaja tasemel või veelgi kitsamas grupis. Tavalise administraatori kasutamine selleks on tungivalt soovitatav.

Selgitasime välja autologimise. Nüüd peate registreerima serveri jaoks uue ülesande. Käivitame käsu Powershellilt, nii et see näeb välja järgmine:

$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

Mooduli kokkupanek

Nüüd korraldame kõik moodulites, mida saab hiljem kasutada. Kogu valmisskriptide kood on siin, importige ja kasutage.

Kõike eelkirjeldatut saad kasutada eraldi, kui ei taha moodulitega jännata.

käivita minecraft

Esiteks teeme mooduli, mis ei tee muud, kui käivitab skripti, mis kuulab ja kirjutab standardväljundisse.

Parameetriplokis küsib ta, millisest kaustast minecraft käivitada ja kuhu logi panna.

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

Ja peate käivitama minecrafti järgmiselt:

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

Liigume nüüd edasi kasutusvalmis Handler.ps1 juurde

Selleks, et meie skript kutsumisel parameetreid aktsepteeriks, peame määrama ka parameetriploki. Pange tähele, et see töötab Oracle Java-s. Kui kasutate teist distributsiooni, peate muutma käivitatava faili teed.

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

registreeri minecraft

Skript on praktiliselt sama, mis Start-Minecraft, ainult et see registreerib ainult uue ülesande. Aktsepteerib samu argumente. Kui kasutajanimi pole määratud, võtab see praeguse.

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

Registreeri-Autologon

Parameetriplokis aktsepteerib skript kasutajanime ja parooli parameetreid. Kui kasutajanime pole määratud, kasutatakse praeguse kasutaja nime.

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

Selle skripti käivitamine näeb välja selline:

Set-Autologon -Password "PlaintextPassword"

Kuidas kasutada

Nüüd mõelge, kuidas autor ise seda kõike kasutab. Kuidas Minecrafti avalikku serverit Windowsis õigesti juurutada. Alustame päris algusest.

1. Looge kasutaja

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

2. Registreerige ülesanne skripti käivitamiseks

Saate registreeruda sellise mooduliga:

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

Või kasutage standardseid tööriistu:

$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. Lülitage automaatne sisselogimine sisse ja taaskäivitage masin

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

Lõpuleviimine

Autor koostas stsenaariumi, sealhulgas enda jaoks, seetõttu kuulab ta hea meelega teie ettepanekuid stsenaariumi täiustamiseks. Autor loodab, et kogu see kood oli teile vähemalt minimaalselt kasulik ja artikkel on huvitav.

Täiuslik Minecrafti serveri käivitusskript

Allikas: www.habr.com

Lisa kommentaar