Ideális Minecraft szerverindító szkript

Ideális Minecraft szerverindító szkript

A szerző nagyon szereti a játékot, és ő maga is egy kis szerver adminisztrátora, amit "csak barátoknak" üzemeltet. Ahogy az a játékosok körében szokás, a szerveren mindent megmodoltak, ami instabil működést és ebből kifolyólag leállásokat von maga után. Mivel a Powershellt jobban ismeri, mint a boltjai elhelyezkedését az utcájában, úgy döntött, hogy készít egy "A Legjobb Script Minecraft Futtatására 2020". Ez a script szolgált alapként a Ruvds piacon található sablonhoz. . De minden forráskód már megtalálható a cikkben. Most sorban, hogy ez az egész hogyan történt.A szükséges parancsaink

Alternatív naplózás

Egyszer, amikor még pár modot feltelepítettem, észrevettem, hogy a szerver, úgy tűnik, háborús bejelentés nélkül omlik össze. A szerver nem írt hibákat a latest.log-ba vagy a debugba, és a konzol, amelynek elvileg ezt a hibát kellett volna kiírnia és megállnia, le volt zárva.

Ha nem akar írni – nem is kell. Van nekünk Powershellünk a

Tee-Object parancsletével, amely az objektumot egyszerre kiírja egy fájlba és a konzolra..handler.ps1 | Tee-Object .StandardOutput.txt -Append

Így a Powershell be fogja olvasni a StandardOutput-ot és le fogja írni egy fájlba. Ne próbálkozz a

Start-Process -szal, mert az System.ComponentModel.Component-t fog visszaadni, nem pedig StandardOutput-ot, és a -RedirectStandardOutput megakadályozza a bemenetet a konzolba, amit el akarunk kerülni.A futtatási argumentumok

Miután feltelepítetted azt a pár modot, a szerző azt is észrevette, hogy a szerveren nincs elég RAM. Ezt meg kell változtatni a futtatási argumentumokban. Ahelyett, hogy minden alkalommal megváltoztatnád azokat a start.bat-ban, amit mindenki használ, egyszerűen használd ezt a scriptet.

Mivel a Tee-Object csak akkor olvassa a StandardOutput-ot, amikor a futtatható fájl "Közvetlenül így" van meghívva, egy újabb scriptet kell készíteni. Ez a script fogja indítani a Minecraftot. Kezdjük az argumentumokkal.

Ahhoz, hogy a jövőben a végső lustaságot élvezhessük, a scriptnek menet közben kell összegyűjtenie a futtatási argumentumokat. Ehhez kezdjük a legújabb verzió keresésével.

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

A sort-object segítségével mindig a legnagyobb számú objektumot fogjuk választani, bármennyi is legyen benne. A végső lustaság.

Most a szerver memóriáját kell beállítani. Ehhez vegyük a rendszer memória mennyiségét, és írjuk össze a megfelelő összeget string formában.

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

A helyes automatikus újraindítás

A helyes automatikus újraindítás

A szerző másoktól látott .bat fájlokat, de azok nem vették figyelembe, hogy miért állt le a szerver. Kellemetlen, hogy ha csak a mod fájlt kellene kicserélni vagy törölni valamit?
Most helyesen újraindítjuk. A szerző korábban furcsa szkriptekbe ütközött, amelyek a szerver újraindítását végezték, függetlenül attól, hogy miért állt le a szerver. Mi a kilépési kódot fogjuk használni. A Java 0-át használ sikeres befejezésként, ezért erre fogunk alapozni.

Először is hozzunk létre egy funkciót, amely újraindítja a szervert, ha az nem sikeresen fejezi be a működését.

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 ciklusban marad, amíg a szerver a saját konzolján nem fejez be normálisan, a \/stop paranccsal.

Ha mindent automatizálni akarunk, akkor érdemes lenne gyűjteni a kezdési, befejezési dátumot és az okot is, amiért befejeződött.

Ehhez rögzítjük a Start-Process eredményét egy változóba. A szkripten ez í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 rögzítjük az eredményeket egy fájlba. Íme, mi kerül a változóba:

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

Mindezt az Add-Content segítségével hozzá lehet adni a fájlhoz. Egy kis simítással az alábbi szkriptet kapjuk, amit handler.ps1-nek hívunk.

Add-Content -Value "Kezdési idő:" -Path $Logfile 
$global:Process.StartTime
 
Add-Content -Value "Kilépési kód:" -Path $Logfile 
$global:Process.ExitCode | Add-Content $Logfile
    
Add-Content -Value "Kilépési idő:" -Path $Logfile 
$global:Process.ExitTime | Add-Content $Logfile

Most formázzuk meg a szkriptet a handler indításához.

Helyes automatikus indítás

A szerző egyetlen modul segítségével szeretné elindítani a Minecraft különböző verzióit bármelyik útvonalról, és lehetőséget szeretne adni a naplók egy adott mappába való elhelyezésére.

A probléma az, hogy a folyamatot olyan felhasználónak kell indítania, aki be van jelentkezve a rendszerbe. Ezt megtehetjük az asztalon vagy a WinRm-en keresztül. Ha a szervert a rendszer vagy akár az adminisztrátor nevében indítjuk, de nem jelentkezünk be, akkor a Server.jar még az eula.txt-t sem tudja elolvasni, és nem tud elindulni.

Az automatikus bejelentkezést három bejegyzés hozzáadásával aktiválhatjuk a rendszerleíró adatbázisba.

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

Ez nem biztonságos. A felhasználónév és jelszó itt sima szövegben van megadva, ezért külön felhasználót kell létrehozni a szerver futtatásához, amely csak felhasználói szintű hozzáféréssel rendelkezik, vagy egy még szűkebb csoportban. A standard adminisztrátor használatát kifejezetten nem ajánljuk.

Már foglalkoztunk az automatikus belépéssel. Most szükséges regisztrálni egy új feladatot a szerverhez. A parancsot PowerShellből fogjuk futtatni, tehát í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

Összegyűjtjük a modult

Most formába öntjük az egészet modulokba, amelyeket később fel lehet használni. Az összes kész script kód itt található, importáld és használd.

A fent leírtakat külön is használhatod, ha nem szeretnél modulokkal foglalkozni.

Start-Minecraft

Először létrehozunk egy modult, amely csak a script indítására fog szolgálni, amely hallgatni fog és naplózni fogja a standardoutputot.

A paraméterek blokkban megkérdezi, hogy melyik mappából szeretnéd futtatni a Minecraftot és hová kellene a naplót menteni.

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

A Minecraftot így kell indítani:

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

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

Ahhoz, hogy a scriptünk paramétereket tudjon fogadni híváskor, szükséges a paraméterek blokk megadása is. Ne feledd, hogy az Oracle Java-t indítja el, ha másik disztribúciót használsz, módosítani kell 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 "=============== A rendkívüli játékszerver indítása ============"
 
    $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 "Kezdési idő:" $global:Process.StartTime
 
    Write-host "Kilépési kód:" $global:Process.ExitCode
    
    Write-host "Kilépési idő:" $global:Process.ExitTime
 
    Write-host "=============== A rendkívüli játékszerver leállítva ============="
}
 
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

A script gyakorlatilag megismétli a Start-Minecraft-ot, azzal a különbséggel, hogy itt csak egy új feladatot regisztrál. Ugyanazokat az argumentumokat fogadja el. Ha a felhasználónév nem volt megadva, a jelenlegi felhasználó nevét veszi.

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

Register-Autologon

A paraméterek blokkjában a script a Felhasználónév és Jelszó paramétereket veszi fel. Ha a Felhasználónév nem volt megadva, a jelenlegi felhasználó nevét használja.

function Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage="Autologon felhasználónév")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="Felhasználói jelszó")]
        [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 "A Set-Autologon engedélyezi a felhasználói automatikus bejelentkezést."
 
    }
    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 "Az autologon sikeresen beállítva."
 
}

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

Set-Autologon -Password "PlaintextPassword"

Használati útmutató

Most nézzük meg, hogyan használja mindezt az író. Hogy kell helyesen telepíteni a nyilvános Minecraft szervert Windows rendszeren. Kezdjük az elején.

1. Felhasználó létrehozása

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

2. A skriptfuttatási feladat regisztrálása

Regisztrálhatja a modullal így:

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

Vagy használja a standard 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élyezzük az automatikus bejelentkezést, majd újraindítjuk a gépet

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

Befejezés

Az író a saját részére is készítette a skriptet, ezért szívesen várja a javaslataikat a skript fejlesztésére. Reméli, hogy ez a kód legalább minimálisan hasznos volt az önök számára, és hogy az írás érdekesnek bizonyult.

Ideális Minecraft szerverindító szkript

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster