Skripti ideal për nisjen e serverit Minecraft

Skripti ideal për nisjen e serverit Minecraft

Autori e sheh shumë nga loja dhe është gjithashtu administrator i një serveri të vogël "çdo gjë për miqtë". Si zakonisht mes pasionantëve, në server është modifikuar gjithçka, dhe kjo sjell me vete paqëndrueshmëri të funksionimit dhe si pasojë rënie. Duke e njohur Powershell më mirë se sa vendndodhjen e dyqaneve në rrugën e tij, ai mori vendimin për të bërë "Skriptin më të Mirë për Të Nisur Minecraft 2020". Ky skript shërbeu gjithashtu si baza për një templates në marketin Ruvds. Të gjitha kodet burimore janë tashmë në artikull. Tani, hap pas hapi, se si është realizuar gjithçka.

Komandat që na nevojiten

Logimi alternativ

Një herë, duke vendosur edhe disa modifikacione, vura re se serveri, gjëja më e keqe, po ra pa asnjë paralajmërim. Serveri nuk shkruante gabime në latest.log ose në debug, ndërsa konsola, e cila teorikisht duhet ta shkruante këtë gabim dhe të ndalonte, ishte mbyllur.

Nëse nuk do të shkruajë, nuk është problem. Ne kemi Powershell me komandletin Tee-Object, i cili merr objektin dhe e nxjerr atë në një skedar dhe në konsolë në të njëjtën kohë.

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

Me këtë, Powershell do të marrë StandardOutput dhe do ta regjistrojë atë në skedar. Mos u përpiqni të përdorni Start-Process, sepse ai do të kthejë System.ComponentModel.Component, dhe jo StandardOutput, ndërsa -RedirectStandardOutput do ta bëjë të pamundur hyrjen në konsolë, gjë që ne duam të shmangim.

Argumentet e nisjes

Duke vendosur atë çift modesh, autori vuri re se në server gjithashtu mungonte RAM-i. Pra, duhet të ndryshohen argumentet e nisjes. Në vend që të ndryshoni ato çdo herë në start.bat, të cilin të gjithë e përdorin thjesht përdorni këtë skripti.

Duke ditur se Tee-Object lexon StandardOutput, vetëm kur skedari ekzekutohet "ashtu si është", do të kemi nevojë për një skript tjetër. Ky skript do të nisë Minecraft vetë. Të fillojmë me argumentet.

Për të qenë në ardhmen lahen më lehtë, skripti duhet të mbledhë argumentet e nisjes në mënyrë dinamike. Prandaj, le të fillojmë duke kërkuar versionin më të fundit forge.

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

Me përdorimin e sort-object ne gjithmonë do të marim objektin me numrin më të madh, sa herë që i vendosni atje. Ngarkesa e optimizuar.

Tani është koha të caktosh RAM-in për serverin. Për këtë, marrim sasinë e memories sistemike dhe regjistrojmë shumën e saj në string.

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

Rivendosja automatike e duhur

Autori ka parë skedarë .bat nga njerëz të tjerë, por ata nuk merrnin parasysh arsyen pse serveri u ndal. A është e pakëndshme nëse thjesht duhet të ndryshoni skedarin e modit ose të fshini diçka?
Tani do të bëjmë një restart të saktë. Autorin e ka hasur më parë skenarë të çuditshëm që ribashkonin serverin pa marrë parasysh arsyen pse serveri ndalonte. Ne do të përdorim kodin e daljes. Java përdor 0 si përfundim të suksesshëm, kështu që aty do të fillojmë.

Së pari, do të krijojmë një funksion që do të ribashkojë serverin në rast se ai përfundon në mënyrë të pasuksesshme.

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

Skenari do të mbetet në cikël deri sa serveri të përfundojë normalisht nga consola e tij, me komandën /stop.

Nëse ne duam ta automatizojmë gjithçka, do të ishte mirë edhe të mbledhim datën e fillimit, përfundimit, si dhe arsyen e përfundimit.

Për këtë, ne regjistrojmë rezultatin Start-Process në një variabël. Në skenar kjo duket kështu:

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

Dhe më pas, ne regjistrojmë rezultatet në një skedar. Ja çfarë kthehet në variablin tonë:

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

Të gjitha këto nëpërmjet Add-Content mund të shtohen në një skedar. Pas pak rregullimi, e kemi këtë skenar, dhe do ta quajmë handler.ps1.

Add-Content -Value "Koha e fillimit:" -Path $Logfile 
$global:Process.StartTime
 
Add-Content -Value "Kodi i daljes:" -Path $Logfile 
$global:Process.ExitCode | Add-Content $Logfile
    
Add-Content -Value "Koha e daljes:" -Path $Logfile 
$global:Process.ExitTime | Add-Content $Logfile

Tani le të organizojmë skenarin me lëshimin e handler-it.

Ribashkimi i saktë

Autori dëshiron të përdorë një modul për të nisur Minecraft me versione të ndryshme nga çdo rrugë dhe gjithashtu të ketë mundësinë të mbledhë logët në një dosje specifike.

Problemi është se procesi duhet të lansohet nga një përdorues që është në sistem. Kjo mund të bëhet përmes desktopit ose WinRm. Nëse nisni serverin nga emri i sistemit ose madje si administrator, por pa u identifikuar në sistem, Server.jar nuk do të mund të lexojë madje as eula.txt dhe të ndizet.

Ne mund ta aktivizojmë hyrjen automatike në sistem përmes shtimit të tri regjistrave në regjistrin.

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

Kjo nuk është e sigurt. Login dhe fjalëkalimi jepen këtu në tekst të qartë, prandaj, për të filluar serverin duhet të krijoni një përdorues të veçantë, i cili ka akses në nivel përdoruesi ose në një grup më të ngushtë. Përdorimi i administratorit standard për këtë nuk rekomandohet për asnjë arsye.

Çështjen e autologimit e kemi zgjidhur. Tani duhet të regjistrojmë një detyrë të re për serverin. Do ta kemi ekzekutimin e komandës nga PowerShell, kështu që do të duket kështu:

$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

Po e mbledhim modul

Tani le të organizojmë gjithçka në module, të cilat do të mund të përdoren më vonë. Të gjithë kodin e skenave të gatshme e keni këtu, importoni dhe përdorni.

Të gjitha që janë përshkruar më sipër mund t'i përdorni veçmas, nëse nuk dëshironi të angazhoheni me modulet.

Start-Minecraft

Fillimisht do të bëjmë një modul, i cili do të bëjë vetëm atë që do të fillojë një skenar, i cili do të dëgjojë dhe regjistrojë standardoutput.

Në bllokun e parametrave, e pyet se nga cilat dosje do të fillojë Minecraft dhe ku do të ruajë logun.

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

Dhe Minecraft do të nisë kështu:

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

Tani do të kalojmë në Handler.ps1 të gatshëm për përdorim

Që skenari ynë të mund të pranojë parametra gjatë thirrjes, gjithashtu duhet të specifikohet blloku i parametrave. Vini re se ai nis Oracle Java; nëse përdorni një shpërndarje tjetër, do t'ju duhet të ndryshoni rrugën për skedarin ekzekutiv.

param (
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$type,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$MinecraftPath,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$StandardOutput
)
 
Set-Location $MinecraftPath
 
function Restart-Minecraft {
 
    Write-host "=============== Duke fill 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 duke fill 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

Regjistro-Minecraft

Skripti, në thelb, përsërit Start-Minecraft, përveç faktit se thjesht regjistron një detyrë të re. Ai pranon të njëjtat argumente. Emri i përdoruesit, nëse nuk është specified, merret nga përdoruesi aktual.

function Regjistro-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"
    Regjistro-ScheduledTask -TaskName $TaskName -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
    
}
 
Export-ModuleMember -Function Regjistro-Minecraft

Regjistro-Autologon

Në bllokun e parametrave, skripti pranon parametrin Username dhe Password. Nëse Username nuk është specified, përdoret emri i përdoruesit aktual.

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

Kjo është mënyra si mund të ekzekutoni këtë skritp:

Set-Autologon -Password "PlaintextPassword"

Si të përdoret

Tani le të shohim se si autori përdor këtë skritp. Si të konfiguroni në mënyrë të saktë një server publik Minecraft në Windows. Le ta fillojmë nga fillimi.

1. Krijoni një përdorues

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

2. Regjistroni një detyrë për të ekzekutuar skritpin

Mund ta regjistroni duke përdorur modulin si më poshtë:

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

Ose mund të përdorni mjete standarde:

$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. Aktivizoni hyrjen automatike në sistem dhe rinisni kompjuterin

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

Përfundimi

Autori e ka shkruar skritpin, për vetë nevojat e tij, prandaj, do të ishte i kënaqur të dëgjonte propozimet tuaja për përmirësimin e skritpit. Autori shpreson se i gjithë ky kod do t'ju jetë për të paktën minimalisht i dobishëm, dhe artikulli ishte interesant.

Skripti ideal për nisjen e serverit Minecraft

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster