Hati kamili ya kuanzisha seva ya Minecraft

Hati kamili ya kuanzisha seva ya Minecraft

Mwandishi anapenda mchezo huo sana, na yeye mwenyewe ndiye msimamizi wa seva ndogo "kwa marafiki tu." Kama kawaida kati ya amateurs, kila kitu kwenye seva kinarekebishwa, na hii inajumuisha kutokuwa na utulivu na, kwa sababu hiyo, huanguka. Kwa kuwa mwandishi wa Powershell anajua vizuri zaidi kuliko eneo la duka kwenye barabara yake, aliamua kutengeneza "Hati Bora ya Kuzindua Minecraft 2020" Hati hiyo hiyo ilitumika kama msingi wa kiolezo ndani Soko la Ruvds. Lakini vyanzo vyote tayari viko kwenye makala. Sasa, kwa utaratibu, jinsi yote yalivyofanyika.

Amri tunazohitaji

Ukataji miti mbadala

Siku moja, baada ya kusanikisha mods kadhaa zaidi, niligundua kuwa seva, inaonekana, ilikuwa ikianguka bila kutangaza vita. Seva haikuandika makosa katika latest.log au katika utatuzi, na console, ambayo kwa nadharia inapaswa kuandika hitilafu hii na kusimamishwa, ilifungwa.

Ikiwa hataki kuandika, haitaji. Tunayo Powershell na cmdlet Kitu-Tee, ambayo huchukua kitu na kukitoa kwa faili na kwa koni kwa wakati mmoja.

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

Kwa njia hii, Powershell itachukua StandardOutput na kuiandika kwa faili. Usijaribu kutumia Anza-Mchakatokwa sababu itarudi System.ComponentModel.Component na sio StandardOutput, na -RedirectStandardOutput itafanya kuwa haiwezekani kuingia kwenye console, ambayo ndiyo tunataka kuepuka.

Zindua hoja

Baada ya kusanikisha jozi hizo za mods, mwandishi aligundua kuwa seva pia haikuwa na RAM ya kutosha. Na hii inahitaji kubadilisha hoja za uzinduzi. Badala ya kuzibadilisha kila wakati kwenye start.bat, ambazo kila mtu hutumia, tumia tu hati hii.

Kwa kuwa Tee-Object inasoma tu StandardOutput wakati inayoweza kutekelezeka inaitwa "Just Like This", itabidi utengeneze hati nyingine. Hati hii itazinduliwa na Minecraft yenyewe. Tuanze na hoja.

Ili kujiingiza katika uvivu wa mwisho katika siku zijazo, hati lazima ikusanye hoja za uzinduzi kwa kuruka. Ili kufanya hivyo, hebu tuanze kwa kutafuta toleo la hivi karibuni yazua.

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

Kwa kutumia kitu cha kupanga, tutachukua kipengee chenye nambari kubwa kila wakati, haijalishi ni ngapi kati yao utaweka hapo. Uvivu wa mwisho.

Sasa unahitaji kupeana kumbukumbu kwa seva. Ili kufanya hivyo, chukua kiasi cha kumbukumbu ya mfumo na uandike kiasi chake kwa kamba.

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

Sahihisha kuanzisha upya kiotomatiki

Mwandishi ameona faili za .bat kutoka kwa watu wengine, lakini hawakuzingatia sababu kwa nini seva ilisimamishwa. Hii ni ngumu, vipi ikiwa unahitaji tu kubadilisha faili ya mod au kufuta kitu?
Sasa hebu tuanze upya ipasavyo. Mwandishi hapo awali alikutana na hati za kushangaza ambazo zilianzisha tena seva bila kujali kwa nini seva ilizima. Tutatumia exitcode. Java hutumia 0 kama mafanikio, kwa hivyo tutacheza kutoka hapa.

Kwanza, hebu tuunde kazi ambayo itaanza upya seva ikiwa itashindwa.

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

Hati itasalia kwenye kitanzi hadi seva itazima kwa kawaida kutoka kwa kiweko chake kwa kutumia amri ya /stop.

Ikiwa tunaamua kufanya kila kitu kiotomatiki, basi itakuwa nzuri kukusanya tarehe ya kuanza, tarehe ya kukamilika, na pia sababu ya kukamilisha.

Ili kufanya hivyo, tunaandika matokeo ya Mwanzo-Mchakato katika kutofautiana. Katika hati inaonekana kama hii:

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

Na kisha tunaandika matokeo kwa faili. Hii ndio inarudishwa kwetu katika kutofautisha:

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

Yote hii inaweza kuongezwa kwa faili kwa kutumia Ongeza-Maudhui. Baada ya kuichana kidogo, tunapata hati hii, na tuiite 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

Sasa hebu tuunde hati inayozindua kidhibiti.

Uanzishaji sahihi

Mwandishi anataka kuendesha matoleo tofauti ya Minecraft kutoka kwa njia yoyote katika moduli moja, na pia kuwa na uwezo wa kuhifadhi kumbukumbu kwenye folda maalum.

Shida ni kwamba mchakato lazima uanzishwe na mtumiaji ambaye ameingia kwenye mfumo. Hii inaweza kufanywa kupitia desktop au WinRm. Ukiendesha seva kama mtumiaji wa mfumo au hata msimamizi, lakini usiingie, basi Server.jar haitaweza hata kusoma eula.txt na kuanza.

Tunaweza kuwezesha kuingia kiotomatiki kwa kuongeza maingizo matatu kwenye Usajili.

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

Sio salama. Kuingia na nenosiri zimeonyeshwa hapa kwa maandishi wazi, kwa hivyo ili kuanzisha seva unahitaji kuunda mtumiaji tofauti ambaye ana ufikiaji katika kiwango cha mtumiaji, au katika kikundi kidogo zaidi. Haipendekezi kabisa kutumia msimamizi wa kawaida kwa hili.

Tulipanga kuingia kiotomatiki. Sasa unahitaji kusajili kazi mpya kwa seva. Tutaendesha amri kutoka kwa Powershell, kwa hivyo itaonekana kama hii:

$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

Kukusanya moduli

Sasa hebu tuweke kila kitu kwenye moduli ambazo zinaweza kutumika baadaye. Nambari zote za hati zilizotengenezwa tayari ziko hapa, ingiza na utumie.

Unaweza kutumia kila kitu kilichoelezwa hapo juu tofauti ikiwa hutaki kujisumbua na moduli.

Anza-Minecraft

Kwanza, hebu tuunde moduli ambayo haitafanya chochote zaidi ya kuendesha hati ambayo itasikiliza na kurekodi matokeo ya kawaida.

Katika kizuizi cha vigezo, anauliza kutoka kwa folda gani ya kuzindua Minecraft na wapi kuweka logi.

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

Na utahitaji kuzindua Minecraft kama hii:

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

Sasa hebu tuendelee kwenye Handler.ps1 iliyo tayari kutumika

Ili hati yetu ikubali vigezo inapoitwa, tunahitaji pia kutaja kizuizi cha parameta. Tafadhali kumbuka, inaendesha Oracle Java, ikiwa unatumia usambazaji tofauti utahitaji kubadilisha njia ya faili inayoweza kutekelezwa.

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

Usajili-Minecraft

Hati hiyo ni sawa na Start-Minecraft, isipokuwa tu kwamba inasajili kazi mpya. Inakubali hoja sawa. Jina la mtumiaji, ikiwa halijabainishwa, huchukua la sasa.

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

Daftari-Autologon

Katika kizuizi cha vigezo, hati inakubali vigezo vya Jina la mtumiaji na Nenosiri. Ikiwa Jina la mtumiaji halikubainishwa, jina la mtumiaji wa sasa linatumika.

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

Kuendesha hati hii inaonekana kama hii:

Set-Autologon -Password "PlaintextPassword"

Jinsi ya kutumia

Sasa hebu tuangalie jinsi mwandishi mwenyewe anatumia haya yote. Jinsi ya kupeleka vizuri seva ya Minecraft ya umma kwenye Windows. Hebu tuanze tangu mwanzo.

1. Unda mtumiaji

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

2. Sajili kazi ili kuendesha hati

Unaweza kujiandikisha kwa kutumia moduli kama hii:

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

Au tumia zana za kawaida:

$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. Wezesha kuingia kiotomatiki na uwashe tena mashine

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

Kukamilika

Mwandishi alifanya script, ikiwa ni pamoja na yeye mwenyewe, kwa hiyo, atakuwa na furaha kusikiliza mapendekezo yako ya kuboresha script. Mwandishi anatumai kuwa msimbo huu wote ulikuwa na manufaa kidogo kwako, na kwamba makala hiyo ilikuwa ya kuvutia.

Hati kamili ya kuanzisha seva ya Minecraft

Chanzo: mapenzi.com

Kuongeza maoni