It ideale Minecraft-tsjinner opstartskript

It ideale Minecraft-tsjinner opstartskript

De skriuwer hâldt it spultsje tige, en hy is sels de behearder fan in lytse server "suver foar freonen." Lykas gewoanlik is by amateurs, is alles op 'e tsjinner oanpast, en dit bringt instabiliteit mei en, as gefolch, crashes. Om't de skriuwer fan Powershell better wit as de lokaasje fan 'e winkels op syn strjitte, besleat hy om "Bêste skript om Minecraft 2020 te starten" Itselde skript tsjinne as basis foar it sjabloan yn Ruvds Marketplace. Mar alle boarnen binne al yn it artikel. No, yn oarder, hoe't it allegear dien wie.

De kommando's dy't wy nedich binne

Alternative logging

Ien dei, nei it ynstallearjen fan in pear mear mods, ûntduts ik dat de server, blykber, crashte sûnder oarloch te ferklearjen. De tsjinner hat gjin flaters skreaun yn 'e lêste.log of yn 'e debug, en de konsole, dy't yn teory dizze flater skreaun hie en stoppe soe, waard sluten.

As er net skriuwe wol, hoecht er net. Wy hawwe Powershell mei cmdlet Tee-Objekt, dy't in objekt nimt en it tagelyk nei in bestân en nei de konsole útfiert.

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

Op dizze manier sil Powershell de StandardOutput ophelje en it skriuwe nei in bestân. Besykje net te brûken Start-prosesomdat it sil weromkomme System.ComponentModel.Component en net StandardOutput, en -RedirectStandardOutput sil meitsje it ûnmooglik te fieren yn 'e konsole, dat is wat wy wolle mije.

Launch arguminten

Nei it ynstallearjen fan datselde pear mods, merkte de auteur op dat de server ek net genôch RAM hie. En dit fereasket it feroarjen fan de lansearringsarguminten. Yn stee fan in feroaring se eltse kear yn start.bat, dat elkenien brûkt, gewoan brûke dit skript.

Om't Tee-Object allinich StandardOutput lêst as it útfierbere "Just Like This" hjit, moatte jo in oar skript meitsje. Dit skript sil wurde lansearre troch Minecraft sels. Litte wy begjinne mei de arguminten.

Om yn 'e takomst te genietsjen fan ultime luiheid, moat it skript startarguminten sammelje. Om dit te dwaan, litte wy begjinne mei it sykjen nei de lêste ferzje fûgje.

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

Mei help fan sort-object sille wy altyd it objekt mei it grutste oantal nimme, nettsjinsteande hoefolle fan jo dêre pleatse. Ultimate luiheid.

No moatte jo ûnthâld tawize oan de tsjinner. Om dit te dwaan, nim it bedrach fan systeemûnthâld en skriuw it bedrach yn in tekenrige.

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

Korrekte automatysk opnij starte

De skriuwer hat sjoen .bat triemmen fan oare minsken, mar se hawwe gjin rekken hâlden mei de reden wêrom't de tsjinner waard stoppe. Dit is ûngemaklik, wat as jo gewoan it mod-bestân feroarje moatte of wat wiskje?
Litte wy no in goede opstart dwaan. De auteur kaam earder frjemde skripts tsjin dy't de tsjinner opnij starte, nettsjinsteande wêrom't de tsjinner ôfsluten is. Wy sille útgongskoade brûke. Java brûkt 0 as in súkses, dus wy sille fan hjir ôf dûnsje.

Litte wy earst in funksje oanmeitsje dy't de tsjinner opnij starte as it mislearret.

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

It skript sil yn 'e lus bliuwe oant de tsjinner normaal ôfslút fan syn eigen konsole mei it kommando /stop.

As wy beslute om alles te automatisearjen, dan soe it moai wêze om de startdatum, foltôgingsdatum, en ek de reden foar foltôging te sammeljen.

Om dit te dwaan, skriuwe wy it resultaat fan Start-Process yn in fariabele. Yn it skript sjocht it der sa út:

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

En dan skriuwe wy de resultaten nei in bestân. Dit is wat ús weromkomt yn 'e fariabele:

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

Dit alles kin wurde tafoege oan in bestân mei Add-Content. Nei't wy it in bytsje kamen, krije wy dit skript, en litte wy it handler.ps1 neame.

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

Litte wy no in skript meitsje dat handler lanseart.

Korrekte opstart

De skriuwer wol ferskate ferzjes fan Minecraft útfiere fan elk paad yn ien module, en ek logs yn in spesifike map kinne opslaan.

It probleem is dat it proses moat wurde begon troch in brûker dy't ynlogd is by it systeem. Dit kin dien wurde fia it buroblêd of WinRm. As jo ​​rinne de tsjinner as in systeem brûker of sels in behearder, mar net oanmelde, dan Server.jar sil net iens by steat wêze om te lêzen eula.txt en begjinne.

Wy kinne automatyske oanmelding ynskeakelje troch trije yngongen ta te foegjen oan it 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

It is net feilich. De oanmelding en wachtwurd wurde hjir yn platte tekst oanjûn, dus om de tsjinner te begjinnen moatte jo in aparte brûker oanmeitsje dy't tagong hat op brûkersnivo, of yn in noch smellere groep. It is strikt net oan te rieden om hjirfoar in standertbehearder te brûken.

Wy sorteare de auto-login. No moatte jo in nije taak registrearje foar de tsjinner. Wy sille it kommando útfiere fan Powershell, dus it sil der sa útsjen:

$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

It gearstallen fan de module

Litte wy no alles yn modules sette dy't letter brûkt wurde kinne. Alle koade foar klearmakke skripts is hjir, ymportearje en brûke.

Jo kinne alles wat hjirboppe beskreaun is apart brûke as jo net wolle lestich falle mei modules.

Start-Minecraft

Litte wy earst in module oanmeitsje dy't neat mear sil dwaan as in skript útfiere dat sil harkje nei en registrearje standertútfier.

Yn it parameterblok freget hy út hokker map om Minecraft te starten en wêr't it log te pleatsen.

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

En jo moatte Minecraft sa starte:

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

Litte wy no fierder gean nei de klear te brûken Handler.ps1

Om ús skript parameters te akseptearjen as it wurdt neamd, moatte wy ek in parameterblok opjaan. Tink derom, it rint Oracle Java, as jo in oare distribúsje brûke, moatte jo it paad feroarje nei it útfierbere bestân.

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

Registrearje-Minecraft

It skript is praktysk itselde as Start-Minecraft, útsein dat it allinich in nije taak registrearret. Akseptearret deselde arguminten. De brûkersnamme, as net oantsjutte, nimt de aktuele.

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

Registrearje-Autologon

Yn it parameterblok akseptearret it skript de brûkersnamme en wachtwurd parameters. As de brûkersnamme net opjûn is, wurdt de namme fan de aktuele brûker brûkt.

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

It útfieren fan dit skript sjocht der sa út:

Set-Autologon -Password "PlaintextPassword"

Hoe brûke

No litte wy sjen nei hoe't de skriuwer sels brûkt dit alles. Hoe kinne jo in iepenbiere Minecraft-tsjinner op Windows goed ynsette. Litte wy fan it begjin ôf begjinne.

1. Meitsje in brûker

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

2. Registrearje de taak om it skript út te fieren

Jo kinne registrearje mei in module lykas dit:

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

Of brûk standert ark:

$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. Aktivearje auto-login en herstart de masine

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

Fertraging

De skriuwer makke it skript, ynklusyf foar himsels, dêrom sil hy graach harkje nei jo suggestjes foar it ferbetterjen fan it skript. De skriuwer hopet dat al dizze koade op syn minst minimaal nuttich wie foar jo, en dat it artikel ynteressant wie.

It ideale Minecraft-tsjinner opstartskript

Boarne: www.habr.com

Add a comment