Hin fullkomna Minecraft ræsiforrit fyrir netþjón

Hin fullkomna Minecraft ræsiforrit fyrir netþjón

Höfundurinn elskar leikinn mjög mikið og sjálfur er hann stjórnandi á litlum netþjóni „aðeins fyrir vini“. Eins og venjulega meðal áhugamanna er allt á þjóninum breytt og það hefur í för með sér óstöðugleika og þar af leiðandi hrun. Þar sem höfundur Powershell veit betur en staðsetningu verslana við götu hans ákvað hann að gera "Besta handritið til að ræsa Minecraft 2020" Sama handritið var grundvöllur sniðmátsins í Ruvds markaðstorg. Но все исходники уже есть в статье. Сейчас по порядку, как это все производилось.

Skipanirnar sem við þurfum

Альтернативное логирование

Einn daginn, eftir að hafa sett upp nokkur mods í viðbót, uppgötvaði ég að þjónninn, greinilega, var að hrynja án þess að lýsa yfir stríði. Þjónninn skrifaði ekki villur í latest.log eða í debug og vélinni, sem fræðilega hefði átt að skrifa þessa villu og stöðvast, var lokað.

Ef hann vill ekki skrifa, þá þarf hann þess ekki. Við erum með Powershell með cmdlet Tee-Object, sem tekur hlut og sendir hann út í skrá og á stjórnborðið á sama tíma.

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

Таким образом, Powershell будет забирать StandardOutput и записывать его в файл. Не пытайтесь использовать Upphafsferlivegna þess að það mun skila System.ComponentModel.Component en ekki StandardOutput, og -RedirectStandardOutput mun gera það ómögulegt að komast inn í stjórnborðið, sem er það sem við viljum forðast.

Ræstu rök

Eftir að hafa sett upp sama par af mods tók höfundurinn eftir því að þjónninn var líka ekki með nóg vinnsluminni. Og þetta krefst þess að breyta upphafsrökum. Í stað þess að breyta þeim í hvert skipti í start.bat, sem allir nota, notaðu bara þetta script.

Þar sem Tee-Object les aðeins StandardOutput þegar keyrslan heitir "Just Like This", verður þú að búa til annað handrit. Þetta handrit verður hleypt af stokkunum af Minecraft sjálfu. Byrjum á rökunum.

Чтобы в будущем предаваться ультимативной лени, скрипт должен собирать аргументы запуска на лету. Для этого начнем с поиска последней версии móta.

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

Með því að nota sort-object munum við alltaf taka hlutinn með stærstu töluna, sama hversu marga af þeim þú setur þar. Fullkomin leti.

Nú þarftu að úthluta minni til þjónsins. Til að gera þetta skaltu taka magn kerfisminni og skrifa magn þess í streng.

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

Rétt sjálfvirk endurræsing

Höfundur hefur séð .bat skrár frá öðru fólki, en þeir tóku ekki tillit til ástæðunnar fyrir því að þjónninn var stöðvaður. Þetta er óþægilegt, hvað ef þú þarft bara að breyta mod skránni eða eyða einhverju?
Nú skulum við endurræsa almennilega. Höfundur rakst áður á undarlegar forskriftir sem endurræstu þjóninn óháð því hvers vegna þjónninn lokaðist. Við munum nota exitcode. Java notar 0 sem árangur, svo við munum dansa héðan.

Í fyrsta lagi skulum við búa til aðgerð sem mun endurræsa þjóninn ef það mistekst.

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

Скрипт останется в цикле до тех пор, пока сервер из своей же консоли не завершит работу штатно, с помощью команды /stop.

Ef við ákveðum að gera allt sjálfvirkt, þá væri gaman að safna upphafsdagsetningu, lokadagsetningu og einnig ástæðunni fyrir því.

Til að gera þetta skrifum við niðurstöðu Start-Process í breytu. Í handritinu lítur það svona út:

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

Og svo skrifum við niðurstöðurnar í skrá. Þetta er það sem er skilað til okkar í breytunni:

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

Allt þetta er hægt að bæta við skrá með Add-Content. Eftir að hafa greitt það aðeins, fáum við þetta handrit og við skulum kalla það 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

Nú skulum við búa til handrit sem ræsir stjórnanda.

Rétt gangsetning

Автор хочет одним модулем запускать майнкрафт различных версий из любых путей, а также иметь возможность складывать логи в конкретную папку.

Vandamálið er að ferlið verður að hefjast af notanda sem er skráður inn í kerfið. Þetta er hægt að gera í gegnum skjáborðið eða WinRm. Ef þú keyrir þjóninn sem kerfisnotandi eða jafnvel stjórnandi, en skráir þig ekki inn, þá mun Server.jar ekki einu sinni geta lesið eula.txt og byrjað.

Við getum virkjað sjálfvirka innskráningu með því að bæta þremur færslum við skrárinn.

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

Það er ekki öruggt. Innskráningin og lykilorðið eru tilgreind hér í látlausum texta, svo til að ræsa netþjóninn þarftu að búa til sérstakan notanda sem hefur aðgang á notendastigi, eða í enn þrengri hópi. Það er stranglega ekki mælt með því að nota venjulegan stjórnanda fyrir þetta.

Við redduðum sjálfvirkri innskráningu. Nú þarftu að skrá nýtt verkefni fyrir þjóninn. Við munum keyra skipunina frá Powershell, svo hún mun líta svona út:

$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

Samsetning einingarinnar

Nú skulum við setja allt í einingar sem hægt er að nota síðar. Allur kóðinn fyrir tilbúin skriftur er hér, fluttur inn og notaður.

Þú getur notað allt sem lýst er hér að ofan sérstaklega ef þú vilt ekki trufla einingar.

Start-Minecraft

Сначала сделаем модуль, который только и будет делать, что запускать скрипт, который будет слушать и записывать standardoutput.

Í færibreytublokkinni spyr hann úr hvaða möppu eigi að ræsa Minecraft og hvar eigi að setja skrána.

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

А запускать майнкрафт нужно будет так:

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

Nú skulum við halda áfram í Handler.ps1 sem er tilbúið til notkunar

Til þess að handritið okkar geti samþykkt færibreytur þegar það er kallað, þurfum við líka að tilgreina færibreytublokk. Vinsamlegast athugaðu að það keyrir Oracle Java, ef þú ert að nota aðra dreifingu þarftu að breyta slóðinni að keyrsluskránni.

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

Skrá-Minecraft

Скрипт, практически, повторяет Start-Minecraft, за исключением того, что только регистрирует новую задачу. Принимает те же самые аргументы. Имя пользователя, если не было указано, берет текущего.

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

Í færibreytublokkinni samþykkir handritið færibreyturnar Notandanafn og Lykilorð. Ef notandanafn var ekki tilgreint er nafn núverandi notanda notað.

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

Að keyra þetta handrit lítur svona út:

Set-Autologon -Password "PlaintextPassword"

Hvernig á að nota

Nú skulum við skoða hvernig höfundurinn sjálfur notar þetta allt. Hvernig á að dreifa almennum Minecraft netþjóni almennilega á Windows. Við skulum byrja alveg frá upphafi.

1. Búðu til notanda

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

2. Skráðu verkefnið til að keyra handritið

Þú getur skráð þig með einingu eins og þessari:

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

Eða notaðu venjuleg verkfæri:

$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. Virkjaðu sjálfvirka innskráningu og endurræstu vélina

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

Frágangur

Höfundur gerði handritið, þar á meðal fyrir sjálfan sig, því mun hann gjarnan hlusta á tillögur þínar til að bæta handritið. Höfundur vonar að allur þessi kóði hafi verið að minnsta kosti lítið gagnlegur fyrir þig og að greinin hafi verið áhugaverð.

Hin fullkomna Minecraft ræsiforrit fyrir netþjón

Heimild: www.habr.com

Bæta við athugasemd