Ang perpektong Minecraft server startup script

Ang perpektong Minecraft server startup script

Gustung-gusto ng may-akda ang laro, at siya mismo ang tagapangasiwa ng isang maliit na server "purely para sa mga kaibigan." Gaya ng nakasanayan sa mga baguhan, lahat ng nasa server ay binago, at ito ay nangangailangan ng kawalang-tatag at, bilang isang resulta, nag-crash. Dahil mas alam ng may-akda ng Powershell kaysa sa lokasyon ng mga tindahan sa kanyang kalye, nagpasya siyang gumawa ng "Pinakamahusay na Script upang Ilunsad ang Minecraft 2020" Ang parehong script ang nagsilbing batayan para sa template sa Ruvds marketplace. Ngunit ang lahat ng mga mapagkukunan ay nasa artikulo na. Ngayon, sa pagkakasunud-sunod, kung paano ginawa ang lahat.

Ang mga utos na kailangan natin

Alternatibong pag-log

Isang araw, pagkatapos mag-install ng ilang higit pang mga mod, natuklasan ko na ang server, tila, ay nag-crash nang hindi nagdedeklara ng digmaan. Ang server ay hindi sumulat ng mga error sa latest.log o sa debug, at ang console, na sa teorya ay dapat isulat ang error na ito at tumigil, ay isinara.

Kung ayaw niyang magsulat, hindi niya kailangan. Mayroon kaming Powershell na may cmdlet Tee-Object, na kumukuha ng isang bagay at naglalabas nito sa isang file at sa console nang sabay.

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

Sa ganitong paraan, kukunin ng Powershell ang StandardOutput at isusulat ito sa isang file. Huwag subukang gamitin Simula-Prosesodahil ibabalik nito ang System.ComponentModel.Component at hindi StandardOutput, at gagawing imposible ng -RedirectStandardOutput na makapasok sa console, na kung ano ang gusto nating iwasan.

Ilunsad ang mga argumento

Matapos i-install ang parehong pares ng mods, napansin ng may-akda na ang server ay wala ring sapat na RAM. At nangangailangan ito ng pagbabago sa mga argumento sa paglulunsad. Sa halip na baguhin ang mga ito sa bawat oras sa start.bat, na ginagamit ng lahat, gamitin lamang ang script na ito.

Dahil ang Tee-Object ay nagbabasa lamang ng StandardOutput kapag ang executable ay tinatawag na "Just Like This", kailangan mong gumawa ng isa pang script. Ang script na ito ay ilulunsad ng Minecraft mismo. Magsimula tayo sa mga argumento.

Upang magpakasawa sa tunay na katamaran sa hinaharap, ang script ay dapat mangolekta ng mga argumento sa paglulunsad sa mabilisang. Upang gawin ito, magsimula tayo sa pamamagitan ng paghahanap para sa pinakabagong bersyon nakapanday.

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

Gamit ang sort-object, palagi naming kukunin ang object na may pinakamalaking bilang, gaano man karami ang ilagay mo doon. Huling katamaran.

Ngayon ay kailangan mong magtalaga ng memorya sa server. Upang gawin ito, kunin ang halaga ng memorya ng system at isulat ang halaga nito sa string.

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

Tamang awtomatikong pag-restart

Ang may-akda ay nakakita ng mga .bat na file mula sa ibang mga tao, ngunit hindi nila isinasaalang-alang ang dahilan kung bakit natigil ang server. Ito ay hindi maginhawa, paano kung kailangan mo lamang baguhin ang mod file o tanggalin ang isang bagay?
Ngayon gawin natin ang tamang pag-restart. Ang may-akda ay nakatagpo dati ng mga kakaibang script na nag-restart sa server anuman ang dahilan kung bakit nag-shut down ang server. Gagamitin namin ang exitcode. Gumagamit ang Java ng 0 bilang tagumpay, kaya sasayaw tayo mula rito.

Una, gumawa tayo ng function na magre-restart sa server kung nabigo ito.

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 ay mananatili sa loop hanggang sa normal na mag-shut down ang server mula sa sarili nitong console gamit ang /stop command.

Kung magpasya kaming i-automate ang lahat, kung gayon, mainam na kolektahin ang petsa ng pagsisimula, petsa ng pagkumpleto, at ang dahilan din ng pagkumpleto.

Upang gawin ito, isinusulat namin ang resulta ng Start-Process sa isang variable. Sa script, ganito ang hitsura:

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

At pagkatapos ay isusulat namin ang mga resulta sa isang file. Ito ang ibinalik sa amin sa variable:

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

Ang lahat ng ito ay maaaring idagdag sa isang file gamit ang Add-Content. Dahil nasuklay ito ng kaunti, nakuha natin ang script na ito, at tawagin natin itong 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

Ngayon, gumawa tayo ng script na naglulunsad ng handler.

Tamang pagsisimula

Nais ng may-akda na magpatakbo ng iba't ibang bersyon ng Minecraft mula sa anumang landas sa isang module, at makapag-imbak din ng mga log sa isang partikular na folder.

Ang problema ay ang proseso ay dapat na simulan ng isang user na naka-log in sa system. Magagawa ito sa pamamagitan ng desktop o WinRm. Kung patakbuhin mo ang server bilang isang user ng system o kahit isang administrator, ngunit hindi nag-log in, hindi man lang mababasa ng Server.jar ang eula.txt at magsimula.

Maaari naming paganahin ang awtomatikong pag-login sa pamamagitan ng pagdaragdag ng tatlong mga entry sa pagpapatala.

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

Hindi ito ligtas. Ang login at password ay ipinahiwatig dito sa plaintext, kaya upang simulan ang server kailangan mong lumikha ng isang hiwalay na user na may access sa antas ng user, o sa isang mas makitid na grupo. Mahigpit na hindi inirerekomenda na gumamit ng karaniwang administrator para dito.

Inayos namin ang auto-login. Ngayon ay kailangan mong magrehistro ng isang bagong gawain para sa server. Tatakbo kami ng command mula sa Powershell, kaya ganito ang magiging hitsura:

$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

Pagtitipon ng modyul

Ngayon, ilagay natin ang lahat sa mga module na magagamit sa ibang pagkakataon. Ang lahat ng code para sa mga handa na script ay narito, i-import at gamitin.

Maaari mong gamitin ang lahat ng inilarawan sa itaas nang hiwalay kung ayaw mong mag-abala sa mga module.

Simulan-Minecraft

Una, gumawa tayo ng module na walang ibang gagawin kundi magpatakbo ng script na makikinig at magtatala ng standardoutput.

Sa bloke ng mga parameter, tinanong niya kung aling folder ang ilulunsad ang Minecraft at kung saan ilalagay 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

At kakailanganin mong ilunsad ang Minecraft tulad nito:

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

Ngayon ay lumipat tayo sa handa nang gamitin na Handler.ps1

Upang matanggap ng aming script ang mga parameter kapag tinawag, kailangan din naming tumukoy ng bloke ng parameter. Pakitandaan, ito ay nagpapatakbo ng Oracle Java, kung gumagamit ka ng ibang distribusyon, kakailanganin mong baguhin ang path sa executable na 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

Magrehistro-Minecraft

Ang script ay halos kapareho ng Start-Minecraft, maliban na ito ay nagrerehistro lamang ng isang bagong gawain. Tumatanggap ng parehong mga argumento. Ang username, kung hindi tinukoy, ay tumatagal ng kasalukuyang.

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

Magrehistro-Autologon

Sa block ng mga parameter, tinatanggap ng script ang mga parameter ng Username at Password. Kung ang Username ay hindi tinukoy, ang kasalukuyang pangalan ng gumagamit ay ginagamit.

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 pagpapatakbo ng script na ito ay ganito ang hitsura:

Set-Autologon -Password "PlaintextPassword"

Paano gamitin

Ngayon tingnan natin kung paano ginagamit ng may-akda ang lahat ng ito. Paano maayos na mag-deploy ng pampublikong Minecraft server sa Windows. Magsimula tayo sa simula pa lang.

1. Gumawa ng user

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

2. Irehistro ang gawain upang patakbuhin ang script

Maaari kang magparehistro gamit ang isang module tulad nito:

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

O gumamit ng mga karaniwang tool:

$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. Paganahin ang auto-login at i-reboot ang makina

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

Pagtapos

Ginawa ng may-akda ang script, kabilang ang para sa kanyang sarili, samakatuwid, ikalulugod niyang makinig sa iyong mga mungkahi para sa pagpapabuti ng script. Inaasahan ng may-akda na ang lahat ng code na ito ay hindi bababa sa kapaki-pakinabang sa iyo, at ang artikulo ay kawili-wili.

Ang perpektong Minecraft server startup script

Pinagmulan: www.habr.com

Magdagdag ng komento