Savršen skript za pokretanje Minecraft poslužitelja.

Savršen skript za pokretanje Minecraft poslužitelja.

Autor vrlo voli igru i sam je administrator male igre "samo za prijatelje". Kao što to obično biva među entuzijastima, na serveru je sve modifikovano, što dovodi do nestabilnosti rada i, kao posledica, padova. Kako Powershell poznaje bolje nego lokaciju prodavnica na svojoj ulici, odlučio je da napravi "Najbolji Skript za Pokretanje Minecrafta 2020". Ovaj skript je poslužio kao osnova za šablon u marketplaceu Ruvds. Ali svi izvorni kodovi su već uključeni u članak. Sada po redu, kako je sve to ostvareno.

Potrebne nam komande

Alternativno logovanje

Jednom prilikom, nakon što sam instalirao još nekoliko modova, uvideo sam da server, sudeći po svemu, pada bez najave. Server nije beležio greške u latest.log ili u debug, a konzola, koja bi te greške trebala da prijavi i zaustavi se, bila je zatvorena.

Ne želi da beleži – nema potrebe. Imamo Powershell sa komandletom Tee-Object, koji uzima objekat i prikazuje ga u datoteci i u konzoli istovremeno.

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

Na taj način, Powershell će preuzeti StandardOutput i zapisati ga u datoteku. Ne pokušavajte da koristite Start-Process, jer će vratiti System.ComponentModel.Component, a ne StandardOutput, dok -RedirectStandardOutput uništava unos u konzolu, što želimo da izbegnemo.

Argumenti pokretanja

Nakon što je instalirao pomenutu grupu modova, autor je primetio i da serveru nedostaje operativne memorije. To znači da treba menjati argumente pokretanja. Umesto da ih svaki put menjate u start.bat, koji svi koriste, jednostavno koristite ovaj skript.

Kako Tee-Object čita StandardOutput samo kada se izvršni fajl poziva "direktno", potrebno je napraviti još jedan skript. Ovaj skript će pokrenuti sam Minecraft. Počnimo sa argumentima.

Da bismo se u budućnosti mogli predati ultimativnom lenčarenju, skript treba da prikuplja argumente pokretanja u hodu. Za to počinjemo pretragom poslednje verzije forge.

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

Pomoću sort-object uvek ćemo uzeti objekat sa najvećim brojem, bez obzira koliko ih stavili. Ultimativna lenjost.

Sada je potrebno dodeliti serveru memoriju. Zato uzimamo količinu sistemske memorije i zbrajamo je u string.

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

Ispravno automatsko ponovo pokretanje

Autor je vidio .bat datoteke od drugih, ali nisu uzeli u obzir razlog zbog kojeg je server zaustavljen. Neudobno je što ako treba samo promijeniti mod datoteku ili nešto obrisati?
Sada ćemo napraviti ispravan ponovni pokret. Autor je ranije naišao na čudne skripte koje su ponovno pokretale server bez obzira na razlog zašto je server završio rad. Mi ćemo koristiti exitcode. Java koristi 0 kao uspješan završetak, pa odatle idemo.

Prvo ćemo stvoriti funkciju koja će ponovno pokretati server u slučaju neuspješnog završetka rada.

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

Skripta će ostati u petlji sve dok server iz svoje konzole ne završi rad kako treba, pomoću komande \/stop.

Ako sve to želimo automatizirati, bilo bi dobro i prikupljati datum pokretanja, završetka, kao i razlog završetka.

Za to zapisujemo rezultat Start-Process u varijablu. U skripti to izgleda ovako:

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

A zatim zapisujemo rezultate u datoteku. Ovo što se vraća u varijablu:

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

Sve to uz pomoć Add-Content možemo dodati u datoteku. Malo dorađujući, dobivamo ovakav skript, a nazvat ćemo ga handler.ps1.

Add-Content -Value "Vrijeme početka:" -Path $Logfile 
$global:Process.StartTime
 
Add-Content -Value "Izlazni kod:" -Path $Logfile 
$global:Process.ExitCode | Add-Content $Logfile
    
Add-Content -Value "Vrijeme izlaza:" -Path $Logfile 
$global:Process.ExitTime | Add-Content $Logfile

Sada uredimo skriptu za pokretanje handlera.

Ispravna automatska dijaljna

Autor želi pokretati Minecraft različitih verzija iz bilo kojih putanja jednim modulom, kao i imati mogućnost pohranjivanja logova u određenu mapu.

Problem je u tome što proces mora pokrenuti korisnik koji je prijavljen u sustav. To se može raditi putem radne površine ili WinRm. Ako pokretanje servera bude pod imenom sustava ili čak administratora, ali ne uđe u sustav, Server.jar neće moći pročitati eula.txt i pokrenuti se.

Moguće je uključiti automatski prijelaz u sustav dodavanjem tri stavke u registar.

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

To nije sigurno. Korisničko ime i lozinka navedeni su u čistom tekstu, stoga je preporučljivo kreirati zasebnog korisnika s minimalnim privilegijama za pokretanje servera, a ne koristiti standardnog administratora.

Shvatili smo automatski ulaz. Sada trebamo registrirati novu zadatak na serveru. Pokretat ćemo naredbu iz PowerShell-a, pa će to izgledati ovako:

$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

Pripremamo modul

Sada ćemo sve organizirati u module koje ćemo kasnije moći koristiti. Sav kod gotovih skripti ovdje, samo ga uvezite i koristite.

Sve što je opisano iznad možete koristiti zasebno, ako ne želite ulaziti u module.

Start-Minecraft

Prvo ćemo napraviti modul koji će samo pokretati skriptu koja će slušati i zapisivati standardni izlaz.

U bloku parametara traži koja će se mapa koristiti za pokretanje Minecrafta i gdje pohraniti log.

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

Minecraft se mora pokretati ovako:

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

Sada prelazimo na spreman za upotrebu Handler.ps1

Kako bi naš skript mogao primati parametre prilikom poziva, potrebno je također definirati blok parametara. Obratite pažnju, on pokreće Oracle Javu; ako koristite drugačiju distribuciju, potrebno je promijeniti put do izvršne datoteke.

param (
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$type,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$MinecraftPath,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$StandardOutput
)
 
Set-Location $MinecraftPath
 
function Restart-Minecraft {
 
    Write-host "=============== Pokretanje genske igre tipa "
 
    $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 "Vrijeme početka:" $global:Process.StartTime
 
    Write-host "Izlazni kod:" $global:Process.ExitCode
    
    Write-host "Vrijeme izlaza:" $global:Process.ExitTime
 
    Write-host "=============== Zaustavljen genski server tipa ============="
}
 
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

Ovaj skript praktički ponavlja Start-Minecraft, osim što samo registrira novu zadaću. Prihvaća iste argumente. Ako korisničko ime nije određeno, koristi trenutno korisničko ime.

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

U bloku parametara skript prihvaća parametar KorisničkoIme i Lozinka. Ako korisničko ime nije navedeno, koristi ime trenutnog korisnika.

function Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage="Korisničko ime za automatsko prijavljivanje")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="Lozinka korisnika")]
        [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 će omogućiti automatsko prijavljivanje korisnika."
 
    }
    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 "Automatsko prijavljivanje je uspješno postavljeno."
 
}

Pokretanje ovog skripta izgleda ovako:

Set-Autologon -Password "PlaintextPassword"

Kako koristiti

Sada ćemo pogledati kako autor koristi sve ovo. Kako ispravno pokrenuti javni Minecraft server na Windows-u. Počnimo od samog početka.

1. Kreiranje korisnika

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

2. Registracija zadatka za pokretanje skripta

Možete registrirati pomoću modula, ovako:

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

Ili upotrijebiti standardna sredstva:

$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. Omogućavanje automatskog prijavljivanja i restartovanje mašine

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

Zaključak

Autor je napravio skript, uključujući i za sebe, pa će rado čuti vaše prijedloge za poboljšanje skripta. Autor se nada da je sve ovaj kod bio barem minimalno koristan za vas, a članak zanimljiv.

Savršen skript za pokretanje Minecraft poslužitelja.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster