La perfekta starta skripto de Minecraft-servilo

La perfekta starta skripto de Minecraft-servilo

La aŭtoro tre amas la ludon, kaj li mem estas la administranto de malgranda servilo "nure por amikoj". Kiel kutime inter amatoroj, ĉio sur la servilo estas moddita, kaj ĉi tio kunportas malstabilecon de laboro kaj, kiel rezulto, falon. Ĉar la aŭtoro konas Powershell pli bone ol la loko de vendejoj sur sia strato, li decidis fari "Plej Bona Skripto Por Lanĉi Minecraft 2020". La sama skripto servis kiel bazo por la ŝablono en Ruvds foirejo. Sed ĉiuj fontoj jam estas en la artikolo. Nun, en ordo, kiel ĉio estis farita.

La komandoj, kiujn ni bezonas

Alternativa arbohakado

Post kiam mi instalis kelkajn pliajn modifojn, mi trovis, ke la servilo, ŝajne, kraŝis sen deklari militon. La servilo ne skribis erarojn al latest.log aŭ debug, kaj la konzolo, kiu, en teorio, devis skribi ĉi tiun eraron kaj halti, estis fermita.

Se vi ne volas skribi, ne faru. Ni havas Powershell kun cmdlet Tee-Objekto, kiu prenas objekton kaj eligas ĝin al dosiero kaj al la konzolo samtempe.

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

Do Powershell prenos la StandardOutput kaj skribos ĝin al dosiero. Ne provu uzi Komenco-Procezo, ĉar ĝi resendos System.ComponentModel.Component, ne StandardOutput, kaj -RedirectStandardOutput maligos ĝin tajpi en la konzolon, kio estas kion ni volas eviti.

Lanĉu Argumentojn

Instalinte la saman paron da modoj, la aŭtoro rimarkis, ke la servilo ankaŭ ne havas sufiĉe da RAM. Kaj necesas ŝanĝi la lanĉajn argumentojn. Anstataŭ ŝanĝi ilin ĉiufoje en start.bat, kiun ĉiuj uzas, simple uzu ĉi tiun skripton.

Ĉar Tee-Object legas StandardOutput nur kiam la ruleblaĵo nomiĝas "Tiel tiel", unu plia skripto devos esti farita. Ĉi tiu skripto funkcios Minecraft mem. Ni komencu per la argumentoj.

Por indulgi finfinan maldiligenton en la estonteco, la skripto devas kolekti lanĉajn argumentojn sur la flugo. Por fari tion, ni komencu serĉante la lastan version forĝas.

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

Kun sort-object , ni ĉiam prenos la objekton kun la plej granda nombro, kiom ajn vi metas tien. Finfina maldiligento.

Nun ni devas asigni memoron al la servilo. Por fari tion, ni prenas la kvanton da sistemmemoro kaj skribas ĝian kvanton al ĉeno.

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

Taŭga aŭtomata rekomenco

La aŭtoro vidis .bat dosierojn de aliaj homoj, sed ili ne konsideris la kialon, kial la servilo estis haltigita. Estas maloportune, kio se vi nur bezonas ŝanĝi la moddosieron aŭ forigi ion?
Nun ni faru ĝustan rekomencon. La aŭtoro antaŭe renkontis strangajn skriptojn, kiuj rekomencis la servilon sendepende de kial la servilo eliris. Ni uzos elirkodon. Java uzas 0 kiel sukceson, do ni dancu de tie.

Unue, ni kreu funkcion, kiu rekomencos la servilon se ĝi malsukcesos.

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

La skripto restos en la buklo ĝis la servilo eliras normale el sia propra konzolo uzante la komandon /stop.

Se ni decidus aŭtomatigi ĉion, tiam estus bone kolekti la daton de lanĉo, fino, kaj ankaŭ la kialon de la fino.

Por fari tion, ni skribas la rezulton de Start-Process al variablo. En skripto ĝi aspektas jene:

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

Kaj poste skribu la rezultojn al dosiero. Jen kio estas redonita al ni en variablo:

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

Ĉio ĉi povas esti aldonita al la dosiero uzante Add-Content. Brosinte iomete, ni ricevas tian skripton, sed ni nomas ĝin 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

Nun ni desegnu la skripton kun la lanĉo de la prizorganto.

Ĝusta aŭtoŝarĝo

La aŭtoro volas ruli Minecraft de diversaj versioj de iu ajn vojo kun unu modulo, kaj ankaŭ povi meti protokolojn en specifan dosierujon.

La problemo estas, ke la procezo devas esti komencita de uzanto, kiu estas ensalutinta. Ĉi tio povas esti farita per la labortablo aŭ WinRm. Se vi rulas la servilon kiel sistemo aŭ eĉ administranto, sed ne ensalutas, tiam Server.jar eĉ ne povos legi eula.txt kaj komenci.

Ni povas ebligi aŭtologon aldonante tri enirojn al la registro.

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

Ĝi ne estas sekura. La ensaluto kaj pasvorto estas indikitaj ĉi tie per klarteksto, do por komenci la servilon vi devas krei apartan uzanton, kiu havas aliron ĉe la uzantnivelo, aŭ en eĉ pli mallarĝa grupo. Uzado de la norma administranto por ĉi tio estas forte malrekomendita.

Ni eltrovis la aŭtomatan ensalutigon. Nun vi devas registri novan taskon por la servilo. Ni rulos la komandon de Powershell, do ĝi aspektos jene:

$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

Kunvenado de la modulo

Nun ni aranĝu ĉion en moduloj uzeblaj poste. Ĉiuj kodoj de pretaj skriptoj estas ĉi tie, importu kaj uzu.

Vi povas uzi ĉion supre priskribitan aparte, se vi ne volas ĝeni modulojn.

komenci Minecraft

Unue, ni faru modulon, kiu faros nenion krom ruli skripton, kiu aŭskultos kaj skribos al norma eligo.

En la parametrobloko, li demandas de kiu dosierujo lanĉi Minecraft kaj kie meti la protokolon.

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

Kaj vi devos ruli Minecraft tiel:

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

Nun ni transiru al la uzebla Handler.ps1

Por ke nia skripto akceptu parametrojn kiam oni vokis, ni ankaŭ devas specifi parametroblokon. Bonvolu noti, ke ĝi funkcias Oracle Java, se vi uzas alian distribuon, vi devos ŝanĝi la vojon al la plenumebla dosiero.

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

registri minecraft

La skripto estas preskaŭ la sama kiel Start-Minecraft, krom ke ĝi nur registras novan taskon. Akceptas la samajn argumentojn. La uzantnomo, se ne specifita, prenas la nunan.

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

Registru-Aŭtomata ensaluto

En la parametrobloko, la skripto akceptas la Uzantnomo kaj Pasvorto-parametroj. Se Uzantnomo ne estas specifita, la nuna uzantonomo estas uzata.

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

Ruli ĉi tiun skripton aspektas jene:

Set-Autologon -Password "PlaintextPassword"

Kiel uzi

Nun konsideru kiel la aŭtoro mem uzas ĉion ĉi. Kiel ĝuste disfaldi Minecraft publikan servilon en Vindozo. Ni komencu de la komenco mem.

1. Kreu uzanton

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

2. Registru la taskon por ruli la skripton

Vi povas registriĝi kun modulo tiel:

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

Aŭ uzu la normajn ilojn:

$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. Enŝaltu aŭtomatan saluton kaj rekomencu la maŝinon

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

Kompletigo

La aŭtoro faris la skripton, inkluzive por si mem, tial li volonte aŭskultos viajn sugestojn por plibonigi la skripton. La aŭtoro esperas, ke ĉi tiu tuta kodo estis almenaŭ minimume utila por vi, kaj la artikolo estas interesa.

La perfekta starta skripto de Minecraft-servilo

fonto: www.habr.com

Aldoni komenton