L'autore ama molto il gioco ed è anche l'amministratore di un piccolo server "per amici". Come spesso accade tra gli appassionati, il server è stato modificato in tutto, e questo comporta instabilità e, di conseguenza, crash. Poiché conosce meglio PowerShell che la posizione dei negozi nella sua strada, ha deciso di fare "Miglior Script per Avviare Minecraft 2020questo script è servito da base per un modello in . Tuttavia, tutti i sorgenti sono già disponibili nell'articolo. Ora vediamo in ordine come è stato realizzato.
Comandi necessari
Log alternativo
Una volta installati alcuni mod, ho scoperto che il server, apparentemente, crasha senza preavviso. Il server non scriveva errori in latest.log o in debug, e la console, che teoricamente doveva scrivere quell'errore e fermarsi, era chiusa.
Se non vuole scrivere – non importa. Abbiamo PowerShell con il cmdlet Tee-Object, che prende un oggetto e lo scrive in un file e nella console contemporaneamente.
.handler.ps1 | Tee-Object .StandardOutput.txt -AppendIn questo modo, PowerShell prenderà StandardOutput e lo registrerà nel file. Non provate a usare Start-Process, perché restituirà System.ComponentModel.Component e non StandardOutput, mentre -RedirectStandardOutput renderà impossibile l’input nella console, cosa che vogliamo evitare.
Argomenti di avvio
Dopo aver installato quella specifica coppia di mod, l'autore ha notato che il server aveva anche poca memoria RAM. E questo richiede di modificare gli argomenti di avvio. Invece di cambiarli ogni volta in start.bat, che tutti usano, utilizza semplicemente questo script.
Poiché Tee-Object legge StandardOutput solo quando l'eseguibile viene chiamato 'così com'è', sarà necessario creare un altro script. Questo script avvierà direttamente Minecraft. Iniziamo dagli argomenti.
Per poter in futuro abbandonarsi alla pigrizia ultimativa, lo script deve raccogliere gli argomenti di avvio al volo. Per fare ciò, iniziamo cercando l'ultima versione di forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1Con sort-object prenderemo sempre l'oggetto con il numero più alto, indipendentemente da quanti ne mettiate. Pigrizia ultimativa.
Ora è necessario assegnare memoria al server. Per fare questo, prendiamo la quantità di memoria di sistema e ne registriamo il totale in stringa.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"Riavvio automatico corretto
L'autore ha visto file .bat creati da altri, ma non consideravano il motivo per cui il server era stato arrestato. È scomodo se bisogna semplicemente cambiare il file della mod o rimuovere qualcosa.
Adesso faremo un riavvio corretto. L'autore ha precedentemente incontrato strani script che riavviavano il server senza considerare il motivo per cui il server si era arrestato. Useremo exitcode. Java utilizza 0 come success exit, da cui partiremo.
Per prima cosa, creiamo una funzione che riavvierà il server nel caso di un 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 fino a quando il server non si fermerà in modo normale dalla sua stessa console, utilizzando il comando /stop.
Se vogliamo automatizzare tutto, sarebbe utile raccogliere la data di avvio, di arresto, e anche il motivo dell'arresto.
Per fare ciò, registriamo il risultato di Start-Process in una variabile. Nel script appare in questo modo:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThruE poi registriamo i risultati in un file. Questo è ciò che ci viene restituito nella variabile:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeTutto ciò può essere aggiunto a un file usando Add-Content. Facendo un po' di pulizia, otteniamo questo script, che chiameremo handler.ps1.
Add-Content -Value "Orario di inizio:" -Path $Logfile
$global:Process.StartTime
Add-Content -Value "Codice di uscita:" -Path $Logfile
$global:Process.ExitCode | Add-Content $Logfile
Add-Content -Value "Orario di uscita:" -Path $Logfile
$global:Process.ExitTime | Add-Content $Logfile
Ora organizziamo lo script per l'avvio dell'handler.
Avvio automatico corretto
L'autore desidera avviare Minecraft di versioni diverse da qualsiasi percorso tramite un modulo, oltre a poter accumulare i log in una cartella specifica.
Il problema è che il processo deve essere avviato da un utente che è attualmente nel sistema. Questo può essere fatto tramite il desktop o WinRm. Se il server viene avviato come sistema o anche come amministratore, ma non si accede al sistema, allora Server.jar non riuscirà neppure a leggere eula.txt e ad 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 SilentlyContinueQuesto non è sicuro. Nome utente e password vengono specificati qui in chiaro, quindi è necessario creare un utente separato con accesso a livello utente per l'esecuzione del server, o in un gruppo ancora più ristretto. È categoricamente sconsigliato utilizzare l'amministratore standard per questo.
Abbiamo risolto il problema dell'accesso automatico. Ora dobbiamo registrare un nuovo compito per il server. Eseguiremo il comando da Powershell, quindi apparirà 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 HighestStiamo assemblando il modulo
Ora mettiamo tutto in moduli che sarà possibile utilizzare in seguito. Tutto il codice degli script pronti è qui, importate e utilizzate.
Tutto quanto descritto sopra può essere utilizzato separatamente, se non vuoi preoccuparti dei moduli.
Start-Minecraft
Iniziamo a creare un modulo che si occupi esclusivamente di avviare uno script che ascolta e registra l'output standard.
Nel blocco dei parametri, chiede da quale cartella avviare 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-MinecraftE Minecraft dovrà essere avviato in questo modo:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"Ora passiamo al Handler.ps1 pronto per l'uso.
Perché il nostro script possa accettare parametri durante la chiamata, è necessario anche specificare il blocco dei parametri. Tieni presente che avvia Oracle Java; se utilizzi un'altra distribuzione, dovrai modificare il percorso dell'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 "Ora di inizio:" $global:Process.StartTime
Write-host "Codice di uscita:" $global:Process.ExitCode
Write-host "Ora 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
Registra-Minecraft
Lo script riproduce praticamente Start-Minecraft, ad eccezione del fatto che registra solo un nuovo processo. Accetta gli stessi argomenti. Il nome utente, se non specificato, verrà preso da quello 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-MinecraftRegister-Autologon
Nel blocco dei parametri, lo script accetta i parametri Username e Password. Se Username non viene specificato, viene utilizzato il nome dell'utente corrente.
function Set-Autologon {
param (
[Parameter(
HelpMessage="Nome utente per il login automatico")]
$Username = $env:USERNAME,
[Parameter(Mandatory=$true,
HelpMessage="Password dell'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à il login automatico 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 "Il login automatico è stato impostato con successo."
}
L'esecuzione di questo script appare così:
Set-Autologon -Password "PlaintextPassword"Come utilizzare
Ora vediamo come l'autore stesso utilizza tutto ciò. Come configurare correttamente un server pubblico Minecraft su Windows. Cominciamo dall'inizio.
1. Creiamo un utente
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. Registriamo un'attività per eseguire lo script
Puoi registrarti tramite 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 Highest3. Abilitiamo l'accesso automatico al sistema e riavviamo la macchina
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Conclusione
L'autore ha creato lo script anche per sé, quindi è aperto a suggerimenti per migliorarlo. L'autore spera che tutto questo codice sia stato almeno minimamente utile per te e che l'articolo sia interessante.
Fonte: habr.com
