Minecraft zerbitzaria abiarazteko gidoi ezin hobea

Minecraft zerbitzaria abiarazteko gidoi ezin hobea

Egileak asko maite du jokoa, eta bera da zerbitzari txiki baten administratzailea "lagunentzat soilik". Afizionatuen artean ohikoa den moduan, zerbitzarian dena moldatzen da, eta horrek lanaren ezegonkortasuna eta, ondorioz, erorketa dakar. Egileak Powershell bere kaleko denden kokapena baino hobeto ezagutzen duenez, egitea erabaki zuen "Minecraft 2020 abiarazteko gidoi onena". Script bera izan zen txantiloiaren oinarri gisa Ruvds merkatua. Baina iturri guztiak dagoeneko artikuluan daude. Orain, ordenan, nola egin zen dena.

Behar ditugun aginduak

Erregistro alternatiboa

Pare bat mod gehiago instalatu ondoren, zerbitzaria, itxuraz, gerra deklaratu gabe huts egiten ari zela ikusi nuen. Zerbitzariak ez zuen akatsik idatzi latest.log edo debug-en, eta kontsola, teorian errore hori idatzi eta gelditu behar zuen kontsola itxi egin zen.

Ez baduzu idatzi nahi, ez. Powershell dugu cmdlet batekin Tee-Objektua, objektu bat hartu eta aldi berean fitxategi batera eta kontsolara ateratzen duena.

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

Beraz, Powershell-ek StandardOutput jasoko du eta fitxategi batean idatziko du. Ez saiatu erabiltzen Hasi-Prozesua, System.ComponentModel.Component bat itzuliko duelako, ez StandardOutput bat, eta -RedirectStandardOutput-ek ezinezko egingo du kontsolan idaztea, hori da saihestu nahi duguna.

Abiarazi Argumentuak

Mod pare bera instalatu ondoren, egileak zerbitzariak ere RAM nahikorik ez zuela ohartu zen. Eta abiaraztearen argudioak aldatzea beharrezkoa da. Guztiek erabiltzen duten start.bat-en aldi bakoitzean aldatu beharrean, erabili script hau.

Tee-Object-ek StandardOutput irakurtzen duenez, exekutagarria "Horrela" deitzen denean soilik, script bat gehiago egin beharko da. Script honek Minecraft bera exekutatuko du. Has gaitezen argudioekin.

Etorkizunean azken alferkeriaz gozatzeko, gidoiak abiaraztearen argudioak bildu behar ditu hegalean. Horretarako, has gaitezen azken bertsioa bilatzen Agorregi.

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

Sort-object-ekin, beti hartuko dugu kopuru handiena duen objektua, zenbat jartzen dituzun ere. Azken nagikeria.

Orain memoria esleitu behar diogu zerbitzariari. Horretarako, sistemaren memoria-kopurua hartu eta haren zenbatekoa katean idatziko dugu.

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

Berrabiarazte automatiko egokia

Egileak beste pertsona batzuen .bat fitxategiak ikusi ditu, baina ez dute kontuan hartu zerbitzaria gelditu izanaren arrazoia. Desegokia da, zer gertatzen da mod fitxategia aldatu edo zerbait ezabatu behar baduzu?
Orain egin dezagun berrabiarazi egoki bat. Egileak aurretik zerbitzaria berrabiarazten zuten script arraroekin topatu zituen zerbitzaria zergatik irten zen kontuan hartu gabe. Irteera kodea erabiliko dugu. Javak 0 erabiltzen du arrakasta gisa, beraz, dantza dezagun hortik.

Lehenik eta behin, sor dezagun zerbitzaria huts egiten badu berrabiaraziko duen funtzio bat.

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

Scripta begiztan egongo da zerbitzaria bere kontsolatik normalean irten arte /stop komandoa erabiliz.

Dena automatizatzea erabakiko bagenu, ondo legoke abiarazteko data, amaiera eta amaieraren arrazoia jasotzea.

Horretarako, Hasi-Prozesuaren emaitza aldagai batean idazten dugu. Gidoi batean honela ikusten da:

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

Eta ondoren idatzi emaitzak fitxategi batean. Hona hemen aldagai batean itzultzen zaiguna:

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

Hau guztia fitxategira gehi daiteke Add-Content erabiliz. Apur bat eskuilatuta, halako script bat lortzen dugu, baina handler.ps1 deitzen diogu.

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

Orain diseina dezagun script-a kudeatzailea abiarazteko.

Autokarga egokia

Egileak hainbat bertsiotako minecraft exekutatu nahi du edozein bidetatik modulu batekin, eta erregistroak karpeta zehatz batean jartzeko gai izan.

Arazoa da prozesua saioa hasita dagoen erabiltzaile batek hasi behar duela. Hau mahaigainaren edo WinRm bidez egin daiteke. Zerbitzaria sistema edo administratzaile gisa exekutatzen baduzu, baina ez baduzu saioa hasten, Server.jar-ek ezingo du eula.txt irakurri eta hasi ere egin.

Autologon gaitu dezakegu erregistroan hiru sarrera gehituz.

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

Ez da segurua. Saio-hasiera eta pasahitza testu arruntaren bidez adierazten dira hemen, beraz, zerbitzaria abiarazteko, erabiltzaile-mailan sarbidea duen erabiltzaile bereizi bat sortu behar duzu, edo talde are estuago batean. Horretarako administratzaile estandarra erabiltzea gomendagarria da.

Saio automatikoa asmatu dugu. Orain zerbitzarirako zeregin berri bat erregistratu behar duzu. Powershell-etik komandoa exekutatuko dugu, beraz, itxura hau izango du:

$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

Modulua muntatzea

Orain antola dezagun dena geroago erabil daitezkeen moduluetan. Prest egindako scripten kode guztiak hemen daude, inportatu eta erabili.

Goian deskribatutako guztia bereiz erabil dezakezu moduluekin kezkatu nahi ez baduzu.

hasi minecraft

Lehenik eta behin, egin dezagun irteera estandarrean entzun eta idatziko duen script bat exekutatuko ez duen modulu bat.

Parametroen blokean, minecraft zein karpetatatik abiarazi eta erregistroa non jarri galdetzen du.

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

Eta minecraft honela exekutatu beharko duzu:

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

Orain joan gaitezen erabiltzeko prest dagoen Handler.ps1ra

Gure script-ak deitzean parametroak onar ditzan, parametro bloke bat ere zehaztu behar dugu. Kontuan izan Oracle Java exekutatzen duela, beste banaketa bat erabiltzen ari bazara, fitxategi exekutagarriaren bidea aldatu beharko duzu.

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

erregistratu minecraft

Scripta ia Start-Minecraft-en berdina da, zeregin berri bat soilik erregistratzen duela izan ezik. Argudio berdinak onartzen ditu. Erabiltzaile izenak, zehazten ez bada, oraingoa hartzen du.

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

Erregistratu-Autologon

Parametro blokean, script-ak Erabiltzaile-izena eta Pasahitza parametroak onartzen ditu. Erabiltzaile-izena zehazten ez bada, uneko erabiltzailearen izena erabiliko da.

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

Script hau exekutatzen honelakoa da:

Set-Autologon -Password "PlaintextPassword"

Nola erabili

Kontuan hartu orain egileak berak hau guztia nola erabiltzen duen. Nola zabaldu Minecraft zerbitzari publiko bat Windows-en. Has gaitezen hasiera-hasieratik.

1. Sortu erabiltzaile bat

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

2. Erregistratu zeregina scripta exekutatzeko

Modulu batekin izena eman dezakezu honela:

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

Edo erabili tresna estandarrak:

$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. Aktibatu hasierako saioa eta berrabiarazi makina

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

Amaiera

Egileak egin du gidoia, beretzat barne, beraz, pozik entzungo ditu gidoia hobetzeko zure iradokizunak. Egileak espero du kode hori guztia gutxienez gutxieneko baliagarria izan izana zuretzat, eta artikulua interesgarria da.

Minecraft zerbitzaria abiarazteko gidoi ezin hobea

Iturria: www.habr.com

Gehitu iruzkin berria