Popoln skript za zagon strežnika Minecraft

Popoln skript za zagon strežnika Minecraft

Avtorju je igra zelo všeč in sam je skrbnik majhnega strežnika »izključno za prijatelje«. Kot je med amaterji v navadi, je na strežniku vse modificirano, kar potegne za seboj nestabilnost in posledično zrušitve. Ker avtor Powershell bolje pozna lokacijo trgovin na njegovi ulici, se je odločil narediti "Najboljši skript za zagon Minecraft 2020" Isti scenarij je služil kot osnova za predlogo v Tržnica Ruvds. Ampak vsi viri so že v članku. Zdaj pa po vrsti, kako je bilo vse narejeno.

Ukazi, ki jih potrebujemo

Alternativna sečnja

Nekega dne, ko sem namestil še nekaj modifikacij, sem odkril, da se strežnik očitno sesuje, ne da bi napovedal vojno. Strežnik ni zapisal napak v latest.log ali v debug in konzola, ki bi teoretično morala napisati to napako in se ustaviti, je bila zaprta.

Če noče pisati, mu ni treba. Imamo Powershell s cmdlet Tee-Object, ki vzame predmet in ga hkrati izpiše v datoteko in na konzolo.

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

Na ta način bo Powershell prevzel StandardOutput in ga zapisal v datoteko. Ne poskušajte uporabiti Start-Procesker bo vrnil System.ComponentModel.Component in ne StandardOutput, in -RedirectStandardOutput bo onemogočil vstop v konzolo, čemur se želimo izogniti.

Zagon argumentov

Po namestitvi istega para modov je avtor opazil, da tudi strežnik nima dovolj RAM-a. In to zahteva spreminjanje argumentov za zagon. Namesto da jih spreminjate vsakič v start.batu, ki ga vsi uporabljajo, preprosto uporabite ta skript.

Ker Tee-Object bere StandardOutput samo, ko se izvršljiva datoteka imenuje "Tako kot ta", boste morali narediti drug skript. Ta skript bo zagnal sam Minecraft. Začnimo z argumenti.

Da bi se v prihodnosti lahko prepustili ultimativni lenobi, mora skript sproti zbirati argumente za zagon. Če želite to narediti, začnimo z iskanjem najnovejše različice ponarejali.

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

Z uporabo sort-object bomo vedno vzeli objekt z največjim številom, ne glede na to, koliko jih postavite tja. Končna lenoba.

Zdaj morate strežniku dodeliti pomnilnik. Če želite to narediti, vzemite količino sistemskega pomnilnika in zapišite njegovo količino v niz.

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

Pravilen samodejni ponovni zagon

Avtor je videl datoteke .bat od drugih ljudi, vendar niso upoštevali razloga za zaustavitev strežnika. To je neprijetno, kaj pa, če morate samo spremeniti mod datoteko ali nekaj izbrisati?
Zdaj pa naredimo pravi ponovni zagon. Avtor je prej naletel na čudne skripte, ki so znova zagnale strežnik ne glede na to, zakaj se je strežnik zaustavil. Uporabili bomo izhodno kodo. Java uporablja 0 kot uspeh, zato bomo plesali od tukaj.

Najprej ustvarimo funkcijo, ki bo znova zagnala strežnik, če ne uspe.

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

Skript bo ostal v zanki, dokler se strežnik ne zaustavi normalno iz lastne konzole z ukazom /stop.

Če se odločimo za avtomatizacijo vsega, potem bi bilo lepo zbrati začetni datum, datum zaključka in tudi razlog za dokončanje.

Da bi to naredili, zapišemo rezultat Start-Processa v spremenljivko. V scenariju je videti takole:

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

In potem rezultate zapišemo v datoteko. To je tisto, kar nam vrne spremenljivka:

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

Vse to je mogoče dodati v datoteko z uporabo Add-Content. Ko smo malo prečesali, dobimo tale skript in ga poimenujmo 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

Zdaj pa ustvarimo skript, ki zažene upravljalnik.

Pravilen zagon

Avtor želi zagnati različne različice Minecrafta s katere koli poti v enem modulu in imeti tudi možnost shranjevanja dnevnikov v določeni mapi.

Težava je v tem, da mora postopek zagnati uporabnik, ki je prijavljen v sistem. To lahko storite prek namizja ali programa WinRm. Če strežnik zaženete kot sistemski uporabnik ali celo skrbnik, vendar se ne prijavite, potem Server.jar ne bo mogel prebrati niti eula.txt in se zagnati.

Samodejno prijavo lahko omogočimo z dodajanjem treh vnosov v register.

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

Ni varno. Prijava in geslo sta tukaj navedena v golem besedilu, zato morate za zagon strežnika ustvariti ločenega uporabnika, ki ima dostop na ravni uporabnika ali v še ožji skupini. Za to strogo ni priporočljivo uporabljati standardnega skrbnika.

Uredili smo samodejno prijavo. Zdaj morate registrirati novo nalogo za strežnik. Ukaz bomo zagnali iz Powershell-a, tako da bo videti takole:

$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

Sestavljanje modula

Zdaj pa dajmo vse v module, ki jih lahko uporabimo pozneje. Vsa koda za že pripravljene skripte je tukaj, uvozite in uporabite.

Vse zgoraj opisano lahko uporabite ločeno, če se ne želite obremenjevati z moduli.

Start-Minecraft

Najprej ustvarimo modul, ki ne bo naredil nič drugega kot zagnal skript, ki bo poslušal in posnel standardni izhod.

V bloku parametrov vpraša, iz katere mape naj zažene Minecraft in kam naj shrani 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

In Minecraft boste morali zagnati takole:

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

Zdaj pa preidimo na Handler.ps1, ki je pripravljen za uporabo

Da bi naš skript sprejel parametre ob klicu, moramo podati tudi blok parametrov. Upoštevajte, da izvaja Oracle Java, če uporabljate drugo distribucijo, boste morali spremeniti pot do izvršljive 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

Skript je praktično enak Start-Minecraftu, le da registrira samo novo nalogo. Sprejema iste argumente. Uporabniško ime, če ni določeno, prevzame 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

V bloku parametrov skript sprejme parametra Uporabniško ime in Geslo. Če uporabniško ime ni podano, se uporabi ime trenutnega uporabnika.

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

Zagon tega skripta izgleda takole:

Set-Autologon -Password "PlaintextPassword"

Kako uporabljati

Zdaj pa poglejmo, kako vse to uporablja avtor sam. Kako pravilno namestiti javni strežnik Minecraft v sistemu Windows. Začnimo od samega začetka.

1. Ustvarite uporabnika

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

2. Registrirajte opravilo za zagon skripta

Registrirate se lahko s pomočjo modula, kot je ta:

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

Ali pa uporabite standardna orodja:

$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. Omogočite samodejno prijavo in znova zaženite stroj

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

Zaključek

Avtor je scenarij naredil tudi zase, zato bo z veseljem prisluhnil vašim predlogom za izboljšavo scenarija. Avtor upa, da vam je bila vsa ta koda vsaj minimalno uporabna in da je bil članek zanimiv.

Popoln skript za zagon strežnika Minecraft

Vir: www.habr.com

Dodaj komentar