Skripti ideal i nisjes së serverit Minecraft

Skripti ideal i nisjes së serverit Minecraft

Autori e do shumë lojën, dhe ai vetë është administratori i një serveri të vogël "thjesht për miqtë". Siç është e zakonshme në mesin e amatorëve, gjithçka në server është modifikuar, dhe kjo sjell paqëndrueshmëri dhe, si rezultat, përplasje. Meqenëse autori i Powershell e di më mirë se vendndodhjen e dyqaneve në rrugën e tij, ai vendosi të bëjë "Skripti më i mirë për të nisur Minecraft 2020" I njëjti skenar shërbeu si bazë për shabllonin në Tregu i Ruvds. Por të gjitha burimet janë tashmë në artikull. Tani, me radhë, si u bë gjithçka.

Komandat që na duhen

Prerje alternative

Një ditë, pasi instalova disa moda të tjera, zbulova se serveri, me sa duket, po rrëzohej pa shpallur luftë. Serveri nuk ka shkruar gabime në latest.log ose në korrigjimin e gabimeve, dhe konsola, e cila në teori duhej ta shkruante këtë gabim dhe të ndalonte, u mbyll.

Nëse nuk dëshiron të shkruajë, nuk ka nevojë. Ne kemi Powershell me cmdlet Tee-Objekt, i cili merr një objekt dhe e nxjerr atë në një skedar dhe në tastierë në të njëjtën kohë.

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

Në këtë mënyrë, Powershell do të marrë StandardOutput dhe do ta shkruajë atë në një skedar. Mos u mundoni të përdorni Fillimi-Procesisepse do të kthejë System.ComponentModel.Component dhe jo StandardOutput, dhe -RedirectStandardOutput do ta bëjë të pamundur hyrjen në tastierë, gjë që duam të shmangim.

Hap argumentet

Pas instalimit të të njëjtit palë modalitetesh, autori vuri re se serveri gjithashtu nuk kishte RAM të mjaftueshëm. Dhe kjo kërkon ndryshimin e argumenteve të nisjes. Në vend që t'i ndryshoni ato çdo herë në start.bat, të cilin e përdorin të gjithë, thjesht përdorni këtë skript.

Meqenëse Tee-Object lexon StandardOutput vetëm kur ekzekutuesi quhet "Just Like This", do t'ju duhet të bëni një skript tjetër. Ky skenar do të lançohet nga vetë Minecraft. Le të fillojmë me argumentet.

Në mënyrë që të kënaqet me dembelizmin përfundimtar në të ardhmen, skenari duhet të mbledhë argumentet e nisjes menjëherë. Për ta bërë këtë, le të fillojmë duke kërkuar për versionin më të fundit kovaçanë.

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

Duke përdorur sort-object, ne gjithmonë do të marrim objektin me numrin më të madh, pavarësisht se sa prej tyre vendosni atje. Përtacia e fundit.

Tani ju duhet të caktoni memorie në server. Për ta bërë këtë, merrni sasinë e kujtesës së sistemit dhe shkruani sasinë e saj në varg.

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

Rinisja e saktë automatike

Autori ka parë skedarë .bat nga njerëz të tjerë, por ata nuk kanë marrë parasysh arsyen pse serveri u ndal. Kjo është e papërshtatshme, çka nëse thjesht duhet të ndryshoni skedarin mod ose të fshini diçka?
Tani le të bëjmë një rifillim të duhur. Autori më parë hasi në skripta të çuditshme që rinisnin serverin, pavarësisht se pse u mbyll serveri. Ne do të përdorim kodin e daljes. Java përdor 0 si sukses, kështu që ne do të kërcejmë nga këtu.

Së pari, le të krijojmë një funksion që do të rifillojë serverin nëse ai dështon.

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

Skripti do të mbetet në qark derisa serveri të fiket normalisht nga konsola e tij duke përdorur komandën /stop.

Nëse vendosim të automatizojmë gjithçka, atëherë do të ishte mirë të mblidhnim datën e fillimit, datën e përfundimit dhe gjithashtu arsyen e përfundimit.

Për ta bërë këtë, ne shkruajmë rezultatin e Start-Process në një ndryshore. Në skenar 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 i shkruajmë rezultatet në një skedar. Kjo është ajo që na është kthyer në variablin:

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

E gjithë kjo mund të shtohet në një skedar duke përdorur Add-Content. Pasi e kemi krehur pak, marrim këtë skenar dhe le ta quajmë 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

Tani le të krijojmë një skript që lëshon mbajtësin.

Fillimi i duhur

Autori dëshiron të ekzekutojë versione të ndryshme të Minecraft nga çdo rrugë në një modul, dhe gjithashtu të jetë në gjendje të ruajë regjistrat në një dosje specifike.

Problemi është se procesi duhet të fillojë nga një përdorues i cili është i kyçur në sistem. Kjo mund të bëhet përmes desktopit ose WinRm. Nëse e përdorni serverin si përdorues sistemi apo edhe administrator, por nuk identifikoheni, atëherë Server.jar nuk do të jetë në gjendje as të lexojë eula.txt dhe të fillojë.

Mund të aktivizojmë hyrjen automatike duke shtuar tre hyrje në regjistër.

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

Nuk është e sigurt. Hyrja dhe fjalëkalimi tregohen këtu në tekst të thjeshtë, kështu që për të nisur serverin duhet të krijoni një përdorues të veçantë që ka akses në nivelin e përdoruesit, ose në një grup edhe më të ngushtë. Nuk rekomandohet rreptësisht të përdorni një administrator standard për këtë.

Ne zgjidhëm hyrjen automatike. Tani ju duhet të regjistroni një detyrë të re për serverin. Ne do të ekzekutojmë komandën 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

Montimi i modulit

Tani le të vendosim gjithçka në module që mund të përdoren më vonë. I gjithë kodi për skriptet e gatshme është këtu, importoni dhe përdorni.

Ju mund të përdorni gjithçka të përshkruar më sipër veçmas nëse nuk doni të shqetësoheni me modulet.

Start-Minecraft

Së pari, le të krijojmë një modul që nuk do të bëjë asgjë më shumë se të ekzekutojë një skript që do të dëgjojë dhe regjistrojë daljen standarde.

Në bllokun e parametrave, ai pyet se nga cili dosje të nisë Minecraft dhe ku ta vendosë regjistrin.

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 do t'ju duhet të nisni Minecraft si kjo:

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

Tani le të kalojmë te Handler.ps1 gati për përdorim

Në mënyrë që skripti ynë të pranojë parametra kur thirret, ne gjithashtu duhet të specifikojmë një bllok parametrash. Ju lutemi vini re, ai drejton Oracle Java, nëse jeni duke përdorur një shpërndarje tjetër, do t'ju duhet të ndryshoni shtegun drejt skedarit të ekzekutueshëm.

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

Regjistrohu-Minecraft

Skripti është praktikisht i njëjtë me Start-Minecraft, përveç se regjistron vetëm një detyrë të re. Pranon të njëjtat argumente. Emri i përdoruesit, nëse nuk specifikohet, merr atë aktual.

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

Regjistrohu-Autologon

Në bllokun e parametrave, skripti pranon parametrat Emri i përdoruesit dhe Fjalëkalimi. Nëse emri i përdoruesit nuk është specifikuar, 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."
 
}

Ekzekutimi i këtij skripti duket si ky:

Set-Autologon -Password "PlaintextPassword"

Si të përdorni

Tani le të shohim se si vetë autori i përdor të gjitha këto. Si të vendosni siç duhet një server publik Minecraft në Windows. Le të fillojmë nga fillimi.

1. Krijo një përdorues

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

2. Regjistroni detyrën për të ekzekutuar skriptin

Ju mund të regjistroheni duke përdorur një modul si ky:

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

Ose 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. Aktivizo identifikimin automatik dhe rindez makinën

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

Përfundim

Autori e bëri skenarin, duke përfshirë edhe për veten e tij, prandaj, ai do të jetë i lumtur të dëgjojë sugjerimet tuaja për përmirësimin e skenarit. Autori shpreson që i gjithë ky kod ishte të paktën minimalisht i dobishëm për ju, dhe se artikulli ishte interesant.

Skripti ideal i nisjes së serverit Minecraft

Burimi: www.habr.com

Shto një koment