Il miglior script per avviare un server Minecraft

Il miglior script per avviare un server Minecraft

L'autore ama molto il gioco e gestisce un piccolo server "solo per amici". Come si suol dire tra gli appassionati, nel server è stato modificato tutto, il che porta a una certa instabilità e, di conseguenza, a dei crash. Poiché conosce PowerShell meglio della posizione dei negozi nella sua strada, ha deciso di creare “Miglior Script per Avviare Minecraft 2020Questo stesso script è servito come base per il template in marketplace Ruvds. Ma tutti i sorgenti sono già presenti nell'articolo. Ora vediamo passo dopo passo come è stato realizzato il tutto.

Comandi di cui abbiamo bisogno

Logging alternativo

Una volta installati altri mod, ho scoperto che il server, a quanto pare, va in crash senza preavviso. Il server non scriveva errori nel latest.log o nel debug, e la console, che avrebbe dovuto riportare l'errore e fermarsi, era chiusa.

Se non scrive – non importa. Abbiamo PowerShell con il cmdlet Tee-Object, che prende un oggetto e lo stampa sia su un file che sulla console contemporaneamente.

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

In questo modo, PowerShell prenderà lo StandardOutput e lo scriverà nel file. Non provate a usare Start-Process, perché restituirà System.ComponentModel.Component, non lo StandardOutput, e -RedirectStandardOutput impedirà di inserire comandi nella console, cosa che vogliamo evitare.

Argomenti di avvio

Dopo aver installato quei mod, l'autore ha notato che mancava anche la memoria RAM sul server. Occorre quindi modificare gli argomenti di avvio. Invece di cambiarli ogni volta in start.bat, che tutti usano, usate semplicemente questo script.

Dato che Tee-Object legge lo StandardOutput soltanto quando il file eseguibile è chiamato "Direttamente così", sarà necessario creare un altro script. Questo script avvierà Minecraft stesso. Cominciamo con gli argomenti.

Per potere in futuro godere di un'ultra pigrizia, lo script deve raccogliere gli argomenti di avvio al volo. Per questo, cominciamo con la ricerca dell'ultima versione di forge.

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

Con sort-object, prenderemo sempre l'oggetto con il numero più alto, qualunque esso sia. Ultra pigrizia.

Ora dobbiamo assegnare memoria al server. Per farlo, prendiamo la quantità di memoria di sistema e ne registriamo la somma in una string.

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

Corretto riavvio automatico

L'autore ha visto file .bat di altre persone, ma non tenevano conto del motivo per cui il server era stato arrestato. È scomodo, se è solo necessario cambiare un file della mod o rimuovere qualcosa?
Ora faremo un riavvio corretto. L'autore ha precedentemente incontrato script strani che riavviavano il server indipendentemente dal motivo per cui il server si era arrestato. Noi utilizzeremo invece exitcode. Java usa 0 come completamento riuscito, da cui partiremo.

Per prima cosa creiamo una funzione che riavvierà il server in caso di arresto anomalo.

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

Lo script rimarrà in un ciclo finché il server non termina normalmente dalla propria console, utilizzando il comando /stop.

Se vogliamo automatizzare tutto, sarebbe utile registrare la data di avvio, di arresto e anche il motivo dell'arresto.

Per fare questo registriamo il risultato di Start-Process in una variabile. Nel script appare così:

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

Poi registriamo i risultati in un file. Ecco cosa viene restituito nella nostra variabile:

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

Tutto questo può essere aggiunto a un file con Add-Content. Sistemando un po', otteniamo questo script, che chiameremo handler.ps1.

Add-Content -Value "Ora di avvio:" -Path $Logfile 
$global:Process.StartTime
 
Add-Content -Value "Codice di uscita:" -Path $Logfile 
$global:Process.ExitCode | Add-Content $Logfile
    
Add-Content -Value "Ora di uscita:" -Path $Logfile 
$global:Process.ExitTime | Add-Content $Logfile

Ora diamo una forma allo script per l'avvio di handler.

Avvio automatico corretto

L'autore desidera utilizzare un solo modulo per avviare Minecraft in diverse versioni da percorsi qualsiasi e avere la possibilità di memorizzare i log in una cartella specifica.

Il problema è che il processo deve essere avviato da un utente che è loggato nel sistema. Questo può avvenire tramite desktop o WinRm. Se si avvia il server come sistema o anche come amministratore, ma senza accedere, Server.jar non sarà nemmeno in grado di leggere eula.txt e avviarsi.

Possiamo abilitare l'accesso automatico al sistema aggiungendo tre voci nel 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

Questo non è sicuro. Qui il nome utente e la password sono indicati in chiaro, quindi per eseguire il server è necessario creare un utente separato che abbia accesso a livello di utente o in un gruppo ancora più ristretto. Non è assolutamente consigliato utilizzare l'amministratore standard per questo.

Abbiamo risolto il problema dell'accesso automatico. Ora è necessario registrare un nuovo task per il server. Eseguiamo il comando da Powershell, quindi sarà così:

$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

Raccogliamo il modulo

Adesso organizziamo tutto in moduli che potranno essere utilizzati successivamente. Qui c'è tutto il codice degli script pronti, importate e usate.

Tutto quanto descritto sopra può essere utilizzato separatamente, se non volete complicarvi la vita con i moduli.

Start-Minecraft

Iniziamo a creare un modulo che si occupi solo di eseguire uno script che ascolti e registri l'output standard.

Nel blocco dei parametri chiede da quale cartella eseguire Minecraft e dove salvare il log.

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

E Minecraft dovrà essere avviato in questo modo:

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

Ora passiamo al Handler.ps1 pronto all'uso

Affinché il nostro script possa accettare parametri al momento della chiamata, è anche necessario specificare il blocco dei parametri. Si prega di notare che avvia Oracle Java; se si utilizza un'altra distribuzione, sarà necessario modificare il percorso del file eseguibile.

param (
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$type,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$MinecraftPath,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$StandardOutput
)
 
Set-Location $MinecraftPath
 
function Restart-Minecraft {
 
    Write-host "=============== Avvio del server di gioco straordinario ============"
 
    $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 "Inizio tempo:" $global:Process.StartTime
 
    Write-host "Codice di uscita:" $global:Process.ExitCode
    
    Write-host "Tempo di uscita:" $global:Process.ExitTime
 
    Write-host "=============== Server di gioco straordinario fermato ============="
}
 
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

Register-Minecraft

Lo script è praticamente una copia di Start-Minecraft, tranne per il fatto che registra solo un nuovo compito. Accetta gli stessi argomenti. Il nome utente, se non specificato, viene preso dall'attuale.

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

Nella sezione parametri, lo script accetta il parametro Username e Password. Se Username non è specificato, viene utilizzato il nome dell'utente corrente.

funzione Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage="Nome utente per autologon")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="Password utente")]
        [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 abiliterà l'autologon per l'utente."
 
    }
    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 impostato correttamente."
 
}

L'esecuzione di questo script appare così:

Set-Autologon -Password "PlaintextPassword"

Come usare

Ora consideriamo come l'autore utilizza tutto questo. Come configurare correttamente un server pubblico Minecraft su Windows. Iniziamo dall'inizio.

1. Creiamo un utente

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

2. Registriamo un'attività per eseguire lo script

Puoi registrarlo utilizzando il modulo, in questo modo:

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

Oppure utilizzare i mezzi 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. Attiviamo l'autologin e riavviamo la macchina

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

Conclusione

L'autore ha creato lo script anche per sé stesso, quindi ascolterà volentieri i tuoi suggerimenti per migliorarlo. L'autore spera che tutto questo codice sia stato almeno minimamente utile e che l'articolo sia interessante.

Il miglior script per avviare un server Minecraft

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster