U perfettu script di startup di u servitore Minecraft

U perfettu script di startup di u servitore Minecraft

L'autore ama assai u ghjocu, è ellu stessu hè l'amministratore di un servitore chjucu "puramente per l'amichi". Cum'è a solitu trà l'amatori, tuttu in u servitore hè modded, è questu implica inestabilità è, in u risultatu, crashes. Siccomu l'autore di Powershell sapi megliu cà u locu di i magazzini in a so strada, hà decisu di fà "U megliu script per lancià Minecraft 2020" U listessu script hà servitu cum'è a basa per u mudellu in Mercatu Ruvds. Ma tutte e fonti sò digià in l'articulu. Avà, in ordine, cumu era tuttu fattu.

I cumandamenti chì avemu bisognu

Logging alternativu

Un ghjornu, dopu avè installatu un paru di modi più, aghju scupertu chì u servitore, apparentemente, era crashing senza dichjarà guerra. U servitore ùn hà micca scrittu errori in latest.log o in debug, è a cunsola, chì in teoria duveria avè scrittu stu errore è si firmò, hè stata chjusa.

S'ellu ùn vole micca scrive, ùn hà micca bisognu. Avemu Powershell cù cmdlet Tee-Oggettu, chì piglia un ughjettu è u pruduce à un schedariu è à a cunsola à u stessu tempu.

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

In questu modu, Powershell ripiglià u StandardOutput è u scrive in un schedariu. Ùn pruvate micca aduprà Start-Processuperchè turnarà System.ComponentModel.Component è micca StandardOutput, è -RedirectStandardOutput farà impussibile di entre in a cunsola, chì hè ciò chì vulemu evità.

Lanciari argumenti

Dopu avè installatu u listessu paru di mods, l'autore hà nutatu chì u servitore ùn hà micca abbastanza RAM. È questu hè bisognu di cambià l'argumenti di lanciu. Invece di cambià ogni volta in start.bat, chì tutti usanu, basta aduprà stu script.

Siccomu Tee-Object leghje solu StandardOutput quandu l'eseguibile hè chjamatu "Just Like This", avete da fà un altru script. Stu script serà lanciatu da Minecraft stessu. Cuminciamu cù l'argumenti.

Per indulge in l'ultima pigrizia in u futuru, u script deve raccoglie l'argumenti di lanciamentu nantu à a mosca. Per fà questu, cuminciamu à circà l'ultima versione Furzata.

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

Aduprendu sort-object, avemu sempre piglià l'ughjettu cù u più grande numeru, ùn importa quanti di elli vi mette quì. L'ultima pigrizia.

Avà avete bisognu di assignà memoria à u servitore. Per fà questu, pigliate a quantità di memoria di u sistema è scrivite a so quantità in stringa.

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

Currettu riavviu automaticu

L'autore hà vistu i schedarii .bat da altre persone, ma ùn anu micca pigliatu in contu u mutivu perchè u servitore hè statu firmatu. Questu hè inconveniente, chì s'ellu hè solu bisognu di cambià u schedariu mod o sguassà qualcosa?
Avà facemu un riavviu propiu. L'autore in precedenza hà scontru cù script strani chì riavvianu u servitore, indipendendu perchè u servitore chjusu. Avemu aduprà exitcode. Java usa 0 cum'è successu, cusì ballemu da quì.

Prima, creamu una funzione chì riavvia u servitore 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)
    
}

U script resterà in u ciclu finu à chì u servitore si chjude normalmente da a so propria cunsola utilizendu u cumandamentu /stop.

Se decidemu di automatizà tuttu, allora saria bellu di cullà a data di iniziu, a data di cumpiimentu, è ancu u mutivu di a fine.

Per fà questu, scrivemu u risultatu di Start-Process in una variabile. In u script pare cusì:

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

E poi scrivemu i risultati in un schedariu. Questu hè ciò chì ci hè tornatu in a variabile:

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

Tuttu chistu pò esse aghjuntu à un schedariu cù Add-Content. Dopu avè pettinatu un pocu, avemu stu script, è chjamemu 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

Avà creemu un script chì lancia un gestore.

Startup currettu

L'autore vole eseguisce diverse versioni di Minecraft da ogni percorsu in un modulu, è ancu esse capace di almacenà logs in un cartulare specificu.

U prublema hè chì u prucessu deve esse iniziatu da un utilizatore chì hè login in u sistema. Questu pò esse fattu via u desktop o WinRm. Se eseguite u servitore cum'è un utilizatore di sistema o ancu un amministratore, ma ùn fate micca login, allora Server.jar ùn puderà mancu leghje eula.txt è principià.

Pudemu attivà u login automaticu aghjunghjendu trè entrate à u registru.

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

Ùn hè micca sicuru. U login è a password sò indicati quì in testu chjaru, cusì per inizià u servitore avete bisognu di creà un utilizatore separatu chì hà accessu à u livellu di l'utilizatori, o in un gruppu ancu più strettu. Hè strettamente micca cunsigliatu di utilizà un amministratore standard per questu.

Avemu risoltu l'auto-login. Avà avete bisognu di registrà una nova attività per u servitore. Eseguiremu u cumandimu da Powershell, cusì sarà cusì:

$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

Assemblage u modulu

Avà mettemu tuttu in moduli chì ponu esse usatu dopu. Tuttu u codice per scripts ready-made hè quì, impurtate è aduprà.

Pudete aduprà tuttu ciò chì hè descrittu sopra separatamente se ùn vulete micca disturbà cù i moduli.

Start-Minecraft

Prima, creemu un modulu chì ùn farà nunda di più chè eseguisce un script chì ascolterà è registrà output standard.

In u bloccu di i paràmetri, dumanda da quale cartulare lancià Minecraft è induve mette u 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

È avete bisognu di lancià Minecraft cusì:

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

Avà andemu à u Handler.ps1 prontu à aduprà

Per u nostru script per accettà paràmetri quandu chjamati, avemu ancu bisognu di specificà un bloccu di paràmetri. Per piacè nutate, corre Oracle Java, sè vo site cù una distribuzione diversa, avete bisognu di cambià a strada à u schedariu eseguibile.

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

Registru-Minecraft

U script hè praticamente u stessu cum'è Start-Minecraft, salvu chì registra solu un novu compitu. Accetta i stessi argumenti. U nome d'utilizatore, s'ellu ùn hè micca specificatu, piglia l'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

In u bloccu di paràmetri, u script accetta i paràmetri Username è Password. Se u nome d'utilizatore ùn hè micca specificatu, u nome di l'utilizatore attuale hè utilizatu.

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'esecuzione di stu script s'assumiglia cusì:

Set-Autologon -Password "PlaintextPassword"

Cumu aduprà

Avà fighjemu cumu l'autore stessu usa tuttu questu. Cumu implementà bè un servitore publicu Minecraft in Windows. Cuminciamu da u principiu.

1. Crea un utilizatore

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

2. Registrate u compitu per eseguisce u script

Pudete registrà cù un modulu cum'è questu:

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

O utilizate strumenti 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. Habilita l'auto-login è reboot a macchina

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

Finalizazione

L'autore hà fattu u script, ancu per ellu stessu, per quessa, serà felice di sente i vostri suggerimenti per migliurà u script. L'autore spera chì tuttu stu codice era almenu minimamente utile per voi, è chì l'articulu era interessante.

U perfettu script di startup di u servitore Minecraft

Source: www.habr.com

Add a comment