Idealna skripta za pokretanje Minecraft poslužitelja

Idealna skripta za pokretanje Minecraft poslužitelja

Autor jako voli igru, a on sam je administrator malog poslužitelja "čisto za prijatelje". Kao što je uobičajeno među amaterima, sve na serveru je modificirano, a to za sobom povlači nestabilnost i, kao rezultat, padove. Budući da autor Powershell-a zna bolje od lokacije trgovina u svojoj ulici, odlučio je napraviti "Najbolja skripta za pokretanje Minecrafta 2020" Ista skripta poslužila je kao osnova za predložak u Tržnica Ruvds. Ali svi izvori su već u članku. Sada, po redu, kako je to sve učinjeno.

Naredbe koje trebamo

Alternativna sječa

Jednog dana, nakon što sam instalirao još par modova, otkrio sam da se poslužitelj, očito, ruši bez objave rata. Poslužitelj nije zapisao pogreške u latest.log ili u debug, a konzola, koja je u teoriji trebala napisati ovu grešku i zaustaviti se, zatvorena je.

Ako ne želi pisati, ne treba. Imamo Powershell s cmdlet-om Tee-Object, koji uzima objekt i šalje ga u datoteku i na konzolu u isto vrijeme.

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

Na ovaj način Powershell će preuzeti StandardOutput i zapisati ga u datoteku. Ne pokušavajte koristiti Start-Procesjer će vratiti System.ComponentModel.Component a ne StandardOutput, a -RedirectStandardOutput će onemogućiti ulazak u konzolu, što želimo izbjeći.

Pokreni argumente

Nakon instaliranja tog istog para modova, autor je primijetio da poslužitelj također nema dovoljno RAM-a. A to zahtijeva promjenu argumenata pokretanja. Umjesto da ih mijenjate svaki put u start.batu, koji svi koriste, samo koristite ovu skriptu.

Budući da Tee-Object čita StandardOutput samo kada se izvršna datoteka zove "Baš ovako", morat ćete napraviti drugu skriptu. Ovu skriptu će pokrenuti sam Minecraft. Počnimo s argumentima.

Kako bismo se u budućnosti prepustili krajnjoj lijenosti, skripta mora prikupljati argumente pokretanja u hodu. Da bismo to učinili, počnimo traženjem najnovije verzije skovati.

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

Koristeći sort-object, uvijek ćemo uzeti objekt s najvećim brojem, bez obzira koliko ih tamo stavili. Krajnja lijenost.

Sada trebate dodijeliti memoriju poslužitelju. Da biste to učinili, uzmite količinu sistemske memorije i zapišite njen iznos u niz.

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

Ispravno automatsko ponovno pokretanje

Autor je vidio .bat datoteke od drugih ljudi, ali nisu uzeli u obzir razlog zašto je poslužitelj zaustavljen. Ovo je nezgodno, što ako samo trebate promijeniti mod datoteku ili nešto izbrisati?
Sada napravimo ispravno ponovno pokretanje. Autor je ranije naišao na čudne skripte koje su ponovno pokretale poslužitelj bez obzira na to zašto se poslužitelj ugasio. Koristit ćemo izlazni kod. Java koristi 0 kao uspjeh, pa ćemo plesati odavde.

Prvo, stvorimo funkciju koja će ponovno pokrenuti poslužitelj ako ne uspije.

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 se poslužitelj normalno ne ugasi sa svoje konzole pomoću naredbe /stop.

Ako odlučimo sve automatizirati, onda bi bilo lijepo prikupiti datum početka, datum završetka, kao i razlog završetka.

Da bismo to učinili, zapisujemo rezultat Start-Processa 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

I onda zapisujemo rezultate u datoteku. Ovo je ono što nam se vraća u varijabli:

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

Sve se to može dodati u datoteku koristeći Add-Content. Nakon što smo malo pročešljali, dobili smo ovu skriptu, a nazovimo je 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

Kreirajmo sada skriptu koja pokreće rukovatelj.

Ispravno pokretanje

Autor želi pokrenuti različite verzije Minecrafta s bilo koje staze u jednom modulu, te također moći pohraniti zapise u određenu mapu.

Problem je što proces mora pokrenuti korisnik koji je prijavljen u sustav. To se može učiniti putem radne površine ili WinRm-a. Ako pokrenete poslužitelj kao korisnik sustava ili čak administrator, ali se ne prijavite, tada Server.jar neće moći niti pročitati eula.txt i pokrenuti se.

Automatsku prijavu možemo omogućiti dodavanjem tri unosa 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

Nije sigurno. Prijava i lozinka su ovdje navedeni u otvorenom tekstu, tako da za pokretanje poslužitelja morate kreirati zasebnog korisnika koji ima pristup na razini korisnika ili u još užoj grupi. Strogo se ne preporučuje korištenje standardnog administratora za to.

Sredili smo automatsku prijavu. Sada trebate registrirati novi zadatak za poslužitelj. Naredbu ćemo pokrenuti iz Powershell-a, pa će 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

Sastavljanje modula

Stavimo sada sve u module koji se kasnije mogu koristiti. Sav kod za gotove skripte je ovdje, uvezite i koristite.

Sve gore opisano možete koristiti zasebno ako se ne želite gnjaviti s modulima.

Start-Minecraft

Prvo, stvorimo modul koji neće raditi ništa više od pokretanja skripte koja će slušati i snimati standardni izlaz.

U bloku parametara pita iz koje mape pokrenuti Minecraft i gdje staviti dnevnik.

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

I morat ćete pokrenuti Minecraft ovako:

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

Sada prijeđimo na Handler.ps1 spreman za korištenje

Kako bi naša skripta prihvatila parametre kada se pozove, također moramo navesti blok parametara. Imajte na umu da pokreće Oracle Java, ako koristite drugu distribuciju morat ćete 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 "=============== 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

Skripta je praktički ista kao Start-Minecraft, osim što registrira samo novi zadatak. Prihvaća iste argumente. Korisničko ime, ako nije navedeno, preuzima trenutno.

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

U bloku parametara skripta prihvaća parametre Korisničko ime i Lozinka. Ako korisničko ime nije navedeno, koristi se ime trenutnog korisnika.

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

Izvođenje ove skripte izgleda ovako:

Set-Autologon -Password "PlaintextPassword"

Kako koristiti

Sada pogledajmo kako sam autor sve to koristi. Kako ispravno postaviti javni Minecraft poslužitelj na Windows. Krenimo od samog početka.

1. Stvorite korisnika

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

2. Registrirajte zadatak za pokretanje skripte

Možete se registrirati pomoću modula poput ovog:

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

Ili koristite standardne alate:

$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ćite automatsku prijavu i ponovno pokrenite stroj

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

Završetak

Autor je napravio scenarij, uključujući i za sebe, stoga će rado poslušati vaše prijedloge za poboljšanje scenarija. Autor se nada da vam je sav ovaj kod bio barem minimalno koristan, te da je članak bio zanimljiv.

Idealna skripta za pokretanje Minecraft poslužitelja

Izvor: www.habr.com

Dodajte komentar