L-iskritt ideali tal-istartjar tas-server Minecraft

L-iskritt ideali tal-istartjar tas-server Minecraft

L-awtur iħobb ħafna l-logħba, u hu stess huwa l-amministratur ta 'server żgħir "purament għall-ħbieb." Bħas-soltu fost id-dilettanti, kollox fuq is-server huwa modded, u dan jinvolvi instabbiltà u, bħala riżultat, ħabtiet. Peress li l-awtur ta 'Powershell jaf aħjar mill-post tal-ħwienet fit-triq tiegħu, iddeċieda li jagħmel "L-Aħjar Skript biex Tniedi Minecraft 2020" L-istess kitba serviet bħala l-bażi għall-mudell in Is-suq ta' Ruvds. Iżda s-sorsi kollha diġà jinsabu fl-artiklu. Issa, fl-ordni, kif sar kollox.

Il-kmandi li għandna bżonn

Logging alternattiv

Ġurnata waħda, wara li installajt ftit mods aktar, skoprejt li s-server, apparentement, kien qed jiġġarraf mingħajr ma ddikjara gwerra. Is-server ma kitebx żbalji f'latest.log jew fid-debug, u l-console, li fit-teorija kellu kiteb dan l-iżball u waqaf, ingħalaq.

Jekk ma jridx jikteb, m'għandux għalfejn. Għandna Powershell b'cmdlet Tee-Oġġett, li jieħu oġġett u joħroġh għal fajl u għall-console fl-istess ħin.

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

Dan il-mod, Powershell se jiġbor l-StandardOutput u jiktbu f'fajl. Tippruvax tuża Bidu-Proċessgħax se jirritorna System.ComponentModel.Component u mhux StandardOutput, u -RedirectStandardOutput jagħmilha impossibbli li tidħol fil-console, li huwa dak li rridu nevitaw.

Tnedija argumenti

Wara li installa dak l-istess par ta 'mods, l-awtur innota li s-server ukoll ma kellux biżżejjed RAM. U dan jeħtieġ li jinbidlu l-argumenti tat-tnedija. Minflok ma tbiddelhom kull darba f'start.bat, li kulħadd juża, uża biss dan l-iskript.

Peress li Tee-Object jaqra biss StandardOutput meta l-eżekutibbli jissejjaħ "Just Like This", ser ikollok tagħmel skript ieħor. Dan l-iskript se jiġi mniedi minn Minecraft innifsu. Nibdew bl-argumenti.

Sabiex jipprattika l-għażż aħħari fil-futur, l-iskript irid jiġbor argumenti tat-tnedija fuq il-fly. Biex tagħmel dan, ejja nibdew billi tfittex l-aħħar verżjoni ssawwar.

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

Bl-użu sort-object, aħna dejjem se nieħdu l-oġġett bl-akbar numru, irrispettivament minn kemm minnhom tpoġġi hemm. Għażż aħħari.

Issa għandek bżonn tassenja memorja lis-server. Biex tagħmel dan, ħu l-ammont ta 'memorja tas-sistema u ikteb l-ammont tagħha f'sekwenza.

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

Irristartja awtomatika korretta

L-awtur ra fajls .bat minn nies oħra, iżda ma qiesx ir-raġuni għaliex is-server twaqqaf. Dan huwa inkonvenjenti, x'jiġri jekk għandek bżonn biss li tibdel il-fajl mod jew tħassar xi ħaġa?
Issa ejja nagħmlu mill-ġdid kif suppost. L-awtur qabel sab skripts strambi li reġgħu bdew is-server irrispettivament minn għaliex is-server għalaq. Aħna se nużaw exitcode. Java juża 0 bħala suċċess, għalhekk aħna ser niżfin minn hawn.

L-ewwel, ejja noħolqu funzjoni li terġa 'tibda s-server jekk ifalli.

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

L-iskript se jibqa 'fil-linja sakemm is-server jagħlaq normalment mill-console tiegħu stess billi juża l-kmand /stop.

Jekk niddeċiedu li nawtomatizzaw kollox, allura jkun sabiħ li niġbru d-data tal-bidu, id-data tat-tlestija, u wkoll ir-raġuni għat-tlestija.

Biex tagħmel dan, niktbu r-riżultat ta 'Start-Process f'varjabbli. Fl-iskrittura tidher hekk:

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

U mbagħad niktbu r-riżultati f'fajl. Dan huwa dak li jiġi rritornat lilna fil-varjabbli:

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

Dan kollu jista 'jiġi miżjud ma' fajl billi tuża Żid-Kontenut. Wara li mimxuta ftit, niksbu din l-iskrittura, u ejja nsejħulha 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

Issa ejja noħolqu b'kitba li tniedi handler.

L-istartjar korrett

L-awtur irid imexxi verżjonijiet differenti ta 'Minecraft minn kwalunkwe mogħdija f'modulu wieħed, u jkun jista' wkoll jaħżen zkuk f'folder speċifiku.

Il-problema hija li l-proċess għandu jinbeda minn utent li jkun illoggjat fis-sistema. Dan jista 'jsir permezz tad-desktop jew WinRm. Jekk tmexxi s-server bħala utent tas-sistema jew saħansitra amministratur, iżda ma tidħolx, allura Server.jar lanqas biss ikun jista' jaqra eula.txt u jibda.

Nistgħu nippermettu login awtomatiku billi nżidu tliet entrati fir-reġistru.

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

Mhuwiex sigur. Il-login u l-password huma indikati hawn b'test sempliċi, għalhekk biex tibda s-server trid toħloq utent separat li jkollu aċċess fil-livell tal-utent, jew fi grupp saħansitra aktar dejjaq. Huwa strettament mhux rakkomandat li tuża amministratur standard għal dan.

Irranġajna l-awto-login. Issa għandek bżonn tirreġistra kompitu ġdid għas-server. Aħna se nħaddmu l-kmand minn Powershell, għalhekk se tidher bħal din:

$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

Armar tal-modulu

Issa ejja npoġġu kollox f'moduli li jistgħu jintużaw aktar tard. Il-kodiċi kollu għal skripts lesti huwa hawn, importazzjoni u użu.

Tista 'tuża dak kollu deskritt hawn fuq separatament jekk ma tridx tolqot bil-moduli.

Ibda-Minecraft

L-ewwel, ejja noħolqu modulu li mhu se jagħmel xejn aktar milli tmexxi script li se jisma 'u jirreġistra output standard.

Fil-blokk tal-parametri, huwa jistaqsi minn liema folder tniedi Minecraft u fejn tpoġġi l-ġurnal.

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

U ser ikollok bżonn tniedi Minecraft bħal dan:

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

Issa ejja ngħaddu għal Handler.ps1 lest għall-użu

Sabiex l-iskrittura tagħna taċċetta parametri meta tissejjaħ, irridu wkoll nispeċifikaw blokka tal-parametri. Jekk jogħġbok innota, taħdem Oracle Java, jekk qed tuża distribuzzjoni differenti ser ikollok bżonn tibdel il-mogħdija għall-fajl eżekutibbli.

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

Reġistru-Minecraft

L-iskript huwa prattikament l-istess bħal Start-Minecraft, ħlief li jirreġistra biss kompitu ġdid. Jaċċetta l-istess argumenti. L-isem tal-utent, jekk mhux speċifikat, jieħu dak attwali.

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

Reġistru-Autologon

Fil-blokk tal-parametri, l-iskrittura jaċċetta l-parametri Username u Password. Jekk Username ma kienx speċifikat, jintuża l-isem tal-utent attwali.

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

It-tħaddim ta' dan l-iskritt jidher bħal dan:

Set-Autologon -Password "PlaintextPassword"

Kif tuża

Issa ejja nħarsu lejn kif l-awtur innifsu juża dan kollu. Kif tuża sew server pubbliku ta' Minecraft fuq il-Windows. Nibdew mill-bidu nett.

1. Oħloq utent

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

2. Irreġistra l-kompitu biex tmexxi l-iskript

Tista' tirreġistra billi tuża modulu bħal dan:

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

Jew uża għodod standard:

$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. Ippermetti l-login awtomatiku u reboot il-magna

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

Tlestija

L-awtur għamel l-iskrittura, inkluż għalih innifsu, għalhekk, se jkun kuntent li jisma 's-suġġerimenti tiegħek għat-titjib tal-iskrittura. L-awtur jittama li dan il-kodiċi kollu kien għall-inqas minimament utli għalik, u li l-artiklu kien interessanti.

L-iskritt ideali tal-istartjar tas-server Minecraft

Sors: www.habr.com

Żid kumment