Az ideális Minecraft szerver indító szkript

Az ideális Minecraft szerver indító szkript

A szerző nagyon szereti a játékot, és ő maga egy kis szerver adminisztrátora „tisztán barátoknak”. Ahogy az amatőröknél lenni szokott, a szerveren minden módosul, ami instabilitással és ennek következtében összeomlással jár. Mivel a Powershell szerzője jobban tudja, hogy az utcájában hol találhatók az üzletek, úgy döntött, hogy "A legjobb forgatókönyv a Minecraft 2020 elindításához" Ugyanez a szkript szolgált a sablon alapjául Ruvds piactér. De az összes forrás már benne van a cikkben. Nos, sorrendben, hogyan történt mindez.

A parancsok, amelyekre szükségünk van

Alternatív naplózás

Egy nap, miután telepítettem néhány további modot, rájöttem, hogy a szerver látszólag összeomlik anélkül, hogy háborút üzent volna. A szerver nem írt hibákat a latest.log-ba vagy a debug-ba, és a konzol, amelynek elméletileg ezt a hibát kellett volna írnia és le kellett volna állnia, bezárult.

Ha nem akar írni, akkor nem kell. Powershellünk van cmdlet-tel Tee-Object, amely egy objektumot vesz, és egyidejűleg kiadja egy fájlba és a konzolba.

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

Ily módon a Powershell felveszi a Standard kimenetet, és fájlba írja. Ne próbálja meg használni Start-folyamatmert visszaadja a System.ComponentModel.Component és nem a StandardOutput, és a -RedirectStandardOutput lehetetlenné teszi a konzolba való belépést, amit el akarunk kerülni.

Indítson el argumentumokat

Miután telepítette ugyanazt a pár modot, a szerző észrevette, hogy a szervernek nincs elég RAM-ja. Ehhez pedig meg kell változtatni az indító argumentumokat. Ahelyett, hogy minden alkalommal módosítaná őket a start.bat fájlban, amelyet mindenki használ, csak használja ezt a szkriptet.

Mivel a Tee-Object csak akkor olvassa be a StandardOutput-ot, amikor a végrehajtható fájl neve "Just Like This", egy másik szkriptet kell készítenie. Ezt a szkriptet maga a Minecraft fogja elindítani. Kezdjük az érvekkel.

Ahhoz, hogy a jövőben a végső lustaságnak hódolhasson, a forgatókönyvnek menet közben indítási érveket kell gyűjtenie. Ehhez kezdjük a legújabb verzió keresésével kovácsol.

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

A sort-object használatával mindig a legnagyobb számú objektumot fogjuk venni, függetlenül attól, hogy hányat teszünk oda. Végső lustaság.

Most memóriát kell hozzárendelnie a szerverhez. Ehhez vegye ki a rendszermemória mennyiségét, és írja be a mennyiségét karakterláncba.

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

Helyes automatikus újraindítás

A szerző látott .bat fájlokat másoktól, de nem vették figyelembe a szerver leállításának okát. Ez kényelmetlen, mi van, ha csak módosítania kell a mod fájlt vagy törölnie kell valamit?
Most kezdjük el a megfelelő újraindítást. A szerző korábban furcsa szkriptekre bukkant, amelyek attól függetlenül újraindították a szervert, hogy miért állt le a szerver. Kilépési kódot fogunk használni. A Java a 0-t használja sikerként, szóval innen táncolunk.

Először is hozzunk létre egy függvényt, amely újraindítja a szervert, ha meghiúsul.

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

A szkript a ciklusban marad mindaddig, amíg a kiszolgáló normál módon le nem áll a saját konzoljáról a /stop paranccsal.

Ha úgy döntünk, hogy mindent automatizálunk, akkor jó lenne összegyűjteni a kezdési dátumot, a befejezés dátumát és a befejezés okát is.

Ehhez a Start-Process eredményét egy változóba írjuk. A forgatókönyvben így néz ki:

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

Aztán az eredményeket egy fájlba írjuk. Ezt adjuk vissza nekünk a változóban:

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

Mindez hozzáadható egy fájlhoz az Add-Content segítségével. Kicsit átfésülve megkapjuk ezt a szkriptet, és nevezzük handler.ps1-nek.

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

Most hozzunk létre egy szkriptet, amely elindítja a kezelőt.

Helyes indítás

A szerző a Minecraft különböző verzióit szeretné futtatni egy modulban tetszőleges útvonalról, és a naplókat egy adott mappában szeretné tárolni.

A probléma az, hogy a folyamatot a rendszerbe bejelentkezett felhasználónak kell elindítania. Ez megtehető az asztalon vagy a WinRm-en keresztül. Ha rendszerfelhasználóként vagy akár rendszergazdaként futtatod a szervert, de nem jelentkezel be, akkor a Server.jar még az eula.txt-t sem tudja elolvasni és elindítani.

Az automatikus bejelentkezést három bejegyzés hozzáadásával tudjuk engedélyezni.

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

Nem biztonságos. A bejelentkezési név és a jelszó itt egyszerű szöveggel van feltüntetve, így a szerver indításához külön felhasználót kell létrehozni, aki felhasználói szinten, vagy még szűkebb csoportban rendelkezik hozzáféréssel. Ehhez szigorúan nem ajánlott normál rendszergazda használata.

Megoldottuk az automatikus bejelentkezést. Most új feladatot kell regisztrálnia a szerveren. A parancsot a Powershellből fogjuk futtatni, így az így fog kinézni:

$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

A modul összeszerelése

Most tegyünk mindent modulokba, amelyek később használhatók. Itt van az összes kód a kész szkriptekhez, importáld és használd.

A fent leírtakat külön is használhatja, ha nem szeretne modulokkal bajlódni.

Start-Minecraft

Először is hozzunk létre egy modult, amely nem tesz mást, mint futtat egy szkriptet, amely figyeli és rögzíti a szabványos kimenetet.

A paraméterblokkban megkérdezi, hogy melyik mappából indítsa el a Minecraftot, és hova tegye a naplót.

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

És el kell indítania a Minecraftot, így:

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

Most térjünk át a használatra kész Handler.ps1-re

Ahhoz, hogy a szkriptünk meghívásakor paramétereket fogadjon el, meg kell adnunk egy paraméterblokkot is. Kérjük, vegye figyelembe, hogy az Oracle Java-t futtatja, ha más disztribúciót használ, meg kell változtatnia a végrehajtható fájl elérési útját.

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

Regisztráció - Minecraft

A szkript gyakorlatilag megegyezik a Start-Minecraftéval, azzal a különbséggel, hogy csak egy új feladatot regisztrál. Elfogadja ugyanazokat az érveket. A felhasználónév, ha nincs megadva, az aktuális nevet veszi fel.

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

Regisztráció-Autologon

A paraméterblokkban a szkript elfogadja a Felhasználónév és a Jelszó paramétereket. Ha a felhasználónév nincs megadva, akkor az aktuális felhasználó neve kerül felhasználásra.

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

A szkript futtatása így néz ki:

Set-Autologon -Password "PlaintextPassword"

Hogyan kell használni

Most pedig nézzük meg, hogyan használja mindezt maga a szerző. Nyilvános Minecraft-kiszolgáló megfelelő telepítése Windows rendszeren. Kezdjük a legelejéről.

1. Hozzon létre egy felhasználót

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

2. Regisztrálja a feladatot a parancsfájl futtatásához

Regisztrálni egy ilyen modul segítségével lehet:

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

Vagy használjon szabványos eszközöket:

$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. Engedélyezze az automatikus bejelentkezést, és indítsa újra a gépet

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

Befejezés

A szerző elkészítette a forgatókönyvet, beleértve saját maga számára is, ezért szívesen meghallgatja a forgatókönyv javítására vonatkozó javaslatait. A szerző reméli, hogy ez a kód legalább minimálisan hasznos volt az Ön számára, és a cikk érdekes volt.

Az ideális Minecraft szerver indító szkript

Forrás: will.com

Hozzászólás