Ang hingpit nga Minecraft server startup script

Ang hingpit nga Minecraft server startup script

Ang tagsulat nahigugma pag-ayo sa dula, ug siya mismo ang tagdumala sa usa ka gamay nga server nga "puro alang sa mga higala". Sama sa naandan sa mga amateurs, ang tanan nga naa sa server gibag-o, ug kini nag-apil sa pagkawalay kalig-on sa trabaho ug, ingon usa ka sangputanan, pagkahulog. Tungod kay mas nahibal-an sa tagsulat ang Powershell kaysa sa lokasyon sa mga tindahan sa iyang dalan, nakahukom siya nga buhaton "Labing Maayo nga Script Aron Ilunsad ang Minecraft 2020". Ang parehas nga script nagsilbi nga sukaranan sa template sa Ruvds merkado. Apan ang tanang tinubdan anaa na sa artikulo. Karon, sa han-ay, kung giunsa kini tanan nahimo.

Ang mga sugo nga atong gikinahanglan

Alternatibong pag-log

Sa higayon nga akong gi-install ang usa ka magtiayon nga dugang nga mods, akong nahibal-an nga ang server, dayag, nag-crash nga wala magdeklarar og gubat. Ang server wala magsulat og mga kasaypanan sa latest.log o debug, ug ang console, nga, sa teorya, mao unta ang magsulat niini nga sayop ug mohunong, gisirhan.

Kung dili ka gustong magsulat, ayaw. Naa mi Powershell nga naay cmdlet Tee-Buhat, nga nagkuha sa usa ka butang ug nagpagawas niini sa usa ka file ug sa console sa parehas nga oras.

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

Mao nga kuhaon sa Powershell ang StandardOutput ug isulat kini sa usa ka file. Ayaw pagsulay sa paggamit Pagsugod-Proseso, tungod kay kini mobalik sa usa ka System.ComponentModel.Component, dili usa ka StandardOutput, ug -RedirectStandardOutput maghimo niini nga imposible ang pag-type sa console, nga mao ang gusto natong likayan.

Ilunsad ang mga argumento

Ang pag-install sa parehas nga pares sa mga mod, namatikdan sa tagsulat nga ang server wala usab igo nga RAM. Ug kinahanglan nga usbon ang mga argumento sa paglansad. Imbis nga usbon kini matag higayon sa start.bat, nga gigamit sa tanan, gamita lang kini nga script.

Tungod kay ang Tee-Object nagbasa sa StandardOutput lamang kung ang executable gitawag nga "Sama ana", usa pa nga script ang kinahanglan buhaton. Kini nga script magpadagan sa minecraft mismo. Magsugod ta sa mga argumento.

Aron sa pagpatuyang sa katapusang pagkatapolan sa umaabot, ang script kinahanglan nga mangolekta sa mga argumento sa paglansad dayon. Aron mahimo kini, magsugod kita pinaagi sa pagpangita sa pinakabag-o nga bersyon forge.

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

Uban sa sort-object , kanunay namong kuhaon ang butang nga adunay pinakadaghang numero, bisag pila ang imong ibutang didto. Katapusan nga pagkatapulan.

Karon kinahanglan namong i-assign ang memorya sa server. Aron mahimo kini, gikuha namon ang kantidad sa memorya sa sistema ug isulat ang kantidad niini sa hilo.

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

Tukma nga awtomatikong pag-restart

Ang tagsulat nakakita sa mga file nga .bat gikan sa ubang mga tawo, apan wala nila tagda ang hinungdan ngano nga gihunong ang server. Dili kombenyente, unsa kaha kung kinahanglan nimo nga usbon ang mod file o tangtangon ang usa ka butang?
Karon atong buhaton ang husto nga pagsugod pag-usab. Ang tagsulat kaniadto nakit-an ang mga katingad-an nga mga script nga nag-restart sa server bisan pa kung ngano nga migawas ang server. Atong gamiton ang exitcode. Gigamit sa Java ang 0 isip kalampusan, busa mosayaw kita gikan didto.

Una, maghimo kita usa ka function nga mag-restart sa server kung kini mapakyas.

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

Ang script magpabilin sa loop hangtod ang server mogawas nga normal gikan sa kaugalingon nga console gamit ang /stop nga mando.

Kung nakahukom kami nga i-automate ang tanan, nan maayo nga kolektahon ang petsa sa paglansad, pagtapos, ug usab ang hinungdan sa katapusan.

Aron mahimo kini, among isulat ang resulta sa Start-Process sa usa ka variable. Sa usa ka script kini ingon niini:

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

Ug dayon isulat ang mga resulta sa usa ka file. Ania ang gibalik kanamo sa usa ka variable:

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

Kining tanan mahimong idugang sa file gamit ang Add-Content. Pag-brush og gamay, nakuha namo ang ingon nga script, apan gitawag namon kini nga 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

Karon atong desinyo ang script sa paglusad sa handler.

Tukma nga autoload

Gusto sa tagsulat nga modagan ang minecraft sa lainlaing mga bersyon gikan sa bisan unsang agianan nga adunay usa ka module, ug mahimo usab nga ibutang ang mga troso sa usa ka piho nga folder.

Ang problema mao nga ang proseso kinahanglan magsugod sa usa ka tiggamit nga naka-log in. Mahimo kini pinaagi sa desktop o WinRm. Kung gipadagan nimo ang server ingon usa ka sistema o bisan usa ka administrador, apan dili mag log in, nan ang Server.jar dili gani makabasa sa eula.txt ug magsugod.

Mahimo natong mapalihok ang autologon pinaagi sa pagdugang og tulo ka entries sa registry.

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

Dili kini luwas. Ang pag-login ug password gipakita dinhi sa plaintext, busa, aron masugdan ang server, kinahanglan nimo nga maghimo usa ka bulag nga tiggamit nga adunay access sa lebel sa tiggamit, o sa usa ka mas pig-ot nga grupo. Ang paggamit sa sumbanan nga tigdumala alang niini kusganon nga nawad-an sa kadasig.

Nahibal-an namon ang autologin. Karon kinahanglan nimo nga magparehistro usa ka bag-ong buluhaton alang sa server. Atong ipadagan ang sugo gikan sa Powershell, mao nga kini tan-awon:

$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

Pag-assemble sa module

Karon atong ihan-ay ang tanan sa mga module nga magamit sa ulahi. Ang tanan nga code sa andam na nga mga script ania dinhi, import ug gamiton.

Mahimo nimong gamiton ang tanan nga gihulagway sa ibabaw nga gilain kung dili nimo gusto nga magsamok sa mga module.

pagsugod sa minecraft

Una, maghimo kita og module nga walay mahimo gawas sa pagpadagan og script nga maminaw ug mosulat sa standardoutput.

Sa block sa parameter, nangutana siya kung asa nga folder ilunsad ang minecraft ug asa ibutang ang log.

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

Ug kinahanglan nimo nga modagan ang minecraft sama niini:

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

Karon magpadayon kita sa andam-gamiton nga Handler.ps1

Aron madawat sa among script ang mga parameter kung gitawag, kinahanglan usab namon nga ipiho ang usa ka bloke sa parameter. Palihug timan-i nga kini nagpadagan sa Oracle Java, kung naggamit ka usa ka lahi nga pag-apod-apod, kinahanglan nimo nga usbon ang agianan sa executable file.

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

pagrehistro sa minecraft

Ang script halos parehas sa Start-Minecraft, gawas nga nagrehistro lamang kini og bag-ong buluhaton. Gidawat ang parehas nga mga argumento. Ang username, kung wala gipiho, gikuha ang karon.

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

Register-Autologon

Sa bloke sa parameter, gidawat sa script ang mga parameter sa Username ug Password. Kung wala gitino ang Username, ang ngalan sa karon nga tiggamit gigamit.

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

Ang pagpadagan niini nga script ingon niini:

Set-Autologon -Password "PlaintextPassword"

Giunsa paggamit

Karon tagda kon sa unsang paagi ang tagsulat mismo naggamit niining tanan. Giunsa ang husto nga pag-deploy sa usa ka publiko nga server sa Minecraft sa Windows. Magsugod ta sa sinugdanan.

1. Paghimo og user

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

2. Irehistro ang buluhaton sa pagpadagan sa script

Mahimo kang magparehistro gamit ang module nga sama niini:

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

O gamita ang standard nga mga himan:

$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. I-on ang autologon ug i-reboot ang makina

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

Pagkompleto

Gihimo sa tagsulat ang script, lakip ang alang sa iyang kaugalingon, busa, malipay siya nga maminaw sa imong mga sugyot alang sa pagpaayo sa script. Ang tagsulat naglaum nga ang tanan nga kini nga code labing gamay nga mapuslanon alang kanimo, ug ang artikulo makapaikag.

Ang hingpit nga Minecraft server startup script

Source: www.habr.com

Idugang sa usa ka comment