L'script d'inici del servidor Minecraft perfecte

L'script d'inici del servidor Minecraft perfecte

L'autor estima molt el joc, i ell mateix és l'administrador d'un petit servidor "purament per a amics". Com és habitual entre els aficionats, tot el que hi ha al servidor està modificat, i això comporta inestabilitat de treball i, com a conseqüència, una caiguda. Com que l'autor coneix Powershell millor que la ubicació de les botigues al seu carrer, va decidir fer "Millor guió per llançar Minecraft 2020". El mateix script va servir de base per a la plantilla Mercat de Ruvds. Però totes les fonts ja estan a l'article. Ara, en ordre, com es va fer tot.

Les ordres que necessitem

Enregistrament alternatiu

Un cop instal·lat un parell de mods més, em vaig trobar que el servidor, pel que sembla, estava caient sense declarar la guerra. El servidor no va escriure errors a latest.log o debug, i la consola, que, en teoria, havia d'escriure aquest error i aturar-se, es va tancar.

Si no vols escriure, no ho facis. Tenim Powershell amb un cmdlet Tee-Objecte, que pren un objecte i l'envia a un fitxer i a la consola alhora.

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

Per tant, Powershell recollirà l'StandardOutput i l'escriurà en un fitxer. No intenteu fer servir procés d'inici, perquè retornarà un System.ComponentModel.Component, no un StandardOutput, i -RedirectStandardOutput farà que sigui impossible escriure a la consola, que és el que volem evitar.

Llançar Arguments

Després d'haver instal·lat el mateix parell de modificacions, l'autor es va adonar que el servidor tampoc tenia prou memòria RAM. I cal canviar els arguments de llançament. En lloc de canviar-los cada vegada a start.bat, que fa servir tothom, només cal que utilitzeu aquest script.

Com que Tee-Object llegeix StandardOutput només quan l'executable es diu "Així mateix", caldrà fer un script més. Aquest script executarà el propi Minecraft. Comencem pels arguments.

Per gaudir de la mandra definitiva en el futur, el guió ha de recollir arguments de llançament sobre la marxa. Per fer-ho, comencem per buscar la darrera versió forjar.

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

Amb sort-object , agafarem sempre l'objecte amb el nombre més gran, per molt que hi posis. Mandra definitiva.

Ara hem d'assignar memòria al servidor. Per fer-ho, prenem la quantitat de memòria del sistema i escrivim la seva quantitat a la cadena.

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

Reinici automàtic correcte

L'autor ha vist fitxers .bat d'altres persones, però no han tingut en compte el motiu pel qual es va aturar el servidor. És inconvenient, què passa si només necessiteu canviar el fitxer de modificacions o suprimir alguna cosa?
Ara fem un reinici correcte. L'autor anteriorment es va trobar amb scripts estranys que reiniciaven el servidor independentment del motiu pel qual s'havia sortit. Utilitzarem el codi de sortida. Java utilitza 0 com a èxit, així que ballem a partir d'aquí.

Primer, creem una funció que reiniciarà el servidor si falla.

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

L'script romandrà en el bucle fins que el servidor surti normalment de la seva pròpia consola mitjançant l'ordre /stop.

Si decidim automatitzar-ho tot, seria bo recollir la data de llançament, finalització i també el motiu del final.

Per fer-ho, escrivim el resultat de Start-Process en una variable. En un script es veu així:

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

I després escriviu els resultats en un fitxer. Aquí teniu el que ens retorna en una variable:

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

Tot això es pot afegir al fitxer mitjançant Add-Content. Després d'haver raspallat una mica, obtenim aquest script, però l'anomenem 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

Ara dissenyem l'script amb el llançament del controlador.

Càrrega automàtica adequada

L'autor vol executar minecraft de diverses versions des de qualsevol camí amb un mòdul i també poder posar els registres en una carpeta específica.

El problema és que el procés l'ha d'iniciar un usuari que hagi iniciat sessió. Això es pot fer a través de l'escriptori o WinRm. Si executeu el servidor com a sistema o fins i tot com a administrador, però no inicieu sessió, Server.jar ni tan sols podrà llegir eula.txt i començar.

Podem habilitar l'inici de sessió automàtic afegint tres entrades al registre.

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

No és segur. L'inici de sessió i la contrasenya s'indiquen aquí amb el text sense format, per tant, per iniciar el servidor, cal crear un usuari independent que tingui accés a nivell d'usuari o en un grup encara més reduït. No es recomana utilitzar l'administrador estàndard per a això.

Hem descobert l'inici de sessió automàtic. Ara heu de registrar una tasca nova per al servidor. Executarem l'ordre des de Powershell, de manera que quedarà així:

$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

Muntatge del mòdul

Ara anem a organitzar-ho tot en mòduls que es poden utilitzar més tard. Tot el codi dels scripts ja fets és aquí, importa i utilitza.

Podeu utilitzar tot el que s'ha descrit anteriorment per separat si no voleu molestar-vos amb els mòduls.

iniciar minecraft

Primer, fem un mòdul que no farà res més que executar un script que escolti i escrigui a la sortida estàndard.

Al bloc de paràmetres, pregunta des de quina carpeta llançar minecraft i on posar el registre.

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

I haureu d'executar minecraft així:

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

Ara passem al Handler.ps1 llest per utilitzar

Perquè el nostre script accepti paràmetres quan es crida, també hem d'especificar un bloc de paràmetres. Tingueu en compte que executa Oracle Java, si feu servir una distribució diferent, haureu de canviar el camí al fitxer executable.

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

registrar minecraft

L'script és pràcticament el mateix que Start-Minecraft, excepte que només registra una tasca nova. Accepta els mateixos arguments. El nom d'usuari, si no s'especifica, pren l'actual.

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

Registre-inici de sessió automàtic

Al bloc de paràmetres, l'script accepta els paràmetres Nom d'usuari i Contrasenya. Si no s'especifica Nom d'usuari, s'utilitza el nom de l'usuari actual.

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

L'execució d'aquest script té aquest aspecte:

Set-Autologon -Password "PlaintextPassword"

Com s'utilitza

Ara considereu com el propi autor utilitza tot això. Com implementar correctament un servidor públic de Minecraft a Windows. Comencem des del principi.

1. Creeu un usuari

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

2. Registreu la tasca per executar l'script

Podeu registrar-vos amb un mòdul com aquest:

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

O utilitzeu les eines estàndard:

$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. Activeu l'inici de sessió automàtic i reinicieu la màquina

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

Terminació

L'autor va fer el guió, inclòs per ell mateix, per tant, estarà encantat d'escoltar els vostres suggeriments per millorar el guió. L'autor espera que tot aquest codi sigui almenys mínimament útil per a vostè, i l'article és interessant.

L'script d'inici del servidor Minecraft perfecte

Font: www.habr.com

Afegeix comentari