L'auteur aime beaucoup le jeu et est lui-mĂȘme administrateur d'un petit serveur « juste pour des amis ». Comme c'est souvent le cas parmi les passionnĂ©s, tout est modifiĂ© sur le serveur, ce qui entraĂźne une instabilitĂ© et, par consĂ©quent, des plantages. Ătant donnĂ© que l'auteur connaĂźt Powershell mieux que l'emplacement des magasins dans sa rue, il a dĂ©cidĂ© de crĂ©er «Le Meilleur Script Pour Lancer Minecraft 2020». Ce mĂȘme script a servi de base Ă un modĂšle sur . Mais tous les fichiers sources sont dĂ©jĂ disponibles dans l'article. Maintenant, voyons comment tout cela a Ă©tĂ© rĂ©alisĂ©.
Les commandes dont nous avons besoin
Journalisation alternative
Une fois que j'ai ajoutĂ© encore quelques mods, j'ai dĂ©couvert que le serveur, apparemment, plante sans prĂ©venir. Le serveur n'Ă©crivait pas d'erreurs dans latest.log ou debug, et la console, qui aurait dĂ» Ă©crire cette erreur et s'arrĂȘter, Ă©tait fermĂ©e.
Si elle ne veut pas Ă©crire â pas besoin. Nous avons Powershell avec la cmdlet Tee-Object, qui prend un objet et l'affiche Ă la fois dans un fichier et dans la console.
.handler.ps1 | Tee-Object .StandardOutput.txt -AppendAinsi, Powershell récupérera le StandardOutput et l'écrira dans un fichier. N'essayez pas d'utiliser Start-Process, car cela retournera System.ComponentModel.Component, et non StandardOutput, et -RedirectStandardOutput rendra impossible l'entrée dans la console, ce que nous voulons éviter.
Arguments de démarrage
AprÚs avoir installé cette paire de mods, l'auteur a remarqué que le serveur manquait également de mémoire vive. Il fallait donc modifier les arguments de démarrage. Au lieu de changer chaque fois dans start.bat, que tout le monde utilise, utilisez simplement ce script.
Puisque Tee-Object lit le StandardOutput seulement lorsque le fichier exĂ©cutable est appelĂ© « directement comme ça », il faudra crĂ©er un autre script. Ce script lancera le Minecraft lui-mĂȘme. Commençons par les arguments.
Pour se consacrer à la paresse ultime à l'avenir, le script doit rassembler les arguments de démarrage à la volée. Pour ce faire, commençons par rechercher la derniÚre version forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1Avec sort-object, nous allons toujours prendre l'objet avec le plus grand chiffre, peu importe combien vous en mettez. La paresse ultime.
Maintenant, il faut attribuer de la mémoire au serveur. Pour cela, nous prenons la quantité de mémoire systÚme et additionnons son total dans une chaßne.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"Redémarrage automatique correct
L'auteur a vu des fichiers .bat d'autres personnes, mais ceux-ci ne prenaient pas en compte la raison pour laquelle le serveur a Ă©tĂ© arrĂȘtĂ©. N'est-il pas ennuyeux de devoir simplement changer le fichier du mod ou de supprimer quelque chose ?
Nous allons maintenant procéder à un redémarrage correct. L'auteur s'est déjà heurté à des scripts étranges qui redémarrent le serveur peu importe pourquoi il a cessé de fonctionner. Nous allons utiliser exitcode. Java utilise 0 comme indication de succÚs, c'est donc sur cela que nous allons nous baser.
Tout d'abord, crĂ©ons une fonction qui redĂ©marrera le serveur en cas d'arrĂȘt inattendu.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Le script restera dans une boucle jusqu'Ă ce que le serveur termine correctement depuis sa propre console, Ă l'aide de la commande /stop.
Si nous souhaitons tout automatiser, il serait judicieux de collecter la date et l'heure de lancement, de fin, ainsi que la raison de la fermeture.
Pour cela, nous enregistrons le résultat de Start-Process dans une variable. Dans le script, cela ressemble à ceci :
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThruEnsuite, nous écrivons les résultats dans un fichier. Voici ce que nous retournons dans la variable :
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeTout cela peut ĂȘtre ajoutĂ© dans un fichier grĂące Ă Add-Content. En le mettant un peu en forme, nous obtenons ce script, que nous allons appeler handler.ps1.
Add-Content -Value "Heure de début:" -Path $Logfile
$global:Process.StartTime
Add-Content -Value "Code de sortie:" -Path $Logfile
$global:Process.ExitCode | Add-Content $Logfile
Add-Content -Value "Heure de sortie:" -Path $Logfile
$global:Process.ExitTime | Add-Content $Logfile
Passons maintenant Ă la mise en forme du script pour le lancement du handler.
Démarrage automatique correct
L'auteur souhaite exécuter Minecraft de différentes versions à partir de n'importe quel chemin avec un seul module, tout en ayant la possibilité de stocker les journaux dans un dossier spécifique.
Le problĂšme est que le processus doit ĂȘtre lancĂ© par un utilisateur qui est connectĂ© au systĂšme. Cela peut se faire via le bureau ou WinRm. Si nous lançons le serveur sous le nom du systĂšme ou mĂȘme en tant qu'administrateur sans ĂȘtre connectĂ©, Server.jar ne pourra mĂȘme pas lire eula.txt et ne pourra pas dĂ©marrer.
Nous pouvons activer l'ouverture de session automatique en ajoutant trois entrées dans le 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 SilentlyContinueC'est dangereux. Le nom d'utilisateur et le mot de passe sont spécifiés en texte clair ici, donc pour exécuter le serveur, il est recommandé de créer un utilisateur distinct ayant des droits d'utilisateur, ou de le placer dans un groupe encore plus restreint. L'utilisation du compte administrateur standard pour cela est catégoriquement déconseillée.
Nous avons compris le fonctionnement de l'auto-connexion. Maintenant, il faut enregistrer une nouvelle tùche pour le serveur. Nous allons exécuter la commande depuis Powershell, donc cela va ressembler à ceci :
$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 HighestAssemblons le module
Maintenant, crĂ©ons tout cela en modules qui pourront ĂȘtre utilisĂ©s par la suite. Tout le code des scripts prĂȘts se trouve ici, importez-le et utilisez-le.
Tout ce qui a Ă©tĂ© dĂ©crit ci-dessus peut ĂȘtre utilisĂ© sĂ©parĂ©ment, si vous ne souhaitez pas vous embĂȘter avec des modules.
Start-Minecraft
Commençons par créer un module qui se chargera uniquement d'exécuter un script qui écoutera et enregistrera la sortie standard.
Dans le bloc des paramĂštres, il demande dans quel dossier exĂ©cuter Minecraft et oĂč stocker le 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-MinecraftEt pour lancer Minecraft, il faudra faire comme ceci :
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"Passons maintenant au Handler.ps1 prĂȘt Ă l'emploi
Pour que notre script puisse accepter des paramÚtres lors de son appel, il faut également spécifier le bloc des paramÚtres. Notez qu'il exécute Oracle Java ; si vous utilisez une autre distribution, il faudra modifier le chemin vers l'exécutable.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== Démarrage du serveur de jeu godlike ============"
$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 "Heure de début:" $global:Process.StartTime
Write-host "Code de sortie:" $global:Process.ExitCode
Write-host "Heure de sortie:" $global:Process.ExitTime
Write-host "=============== Serveur de jeu godlike arrĂȘtĂ© ============="
}
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
Le script ressemble presque Ă Start-Minecraft, Ă l'exception qu'il ne fait que enregistrer une nouvelle tĂąche. Il prend les mĂȘmes arguments. Si aucun nom d'utilisateur n'est spĂ©cifiĂ©, il utilise le nom de l'utilisateur actuel.
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
Dans le bloc de paramÚtres, le script prend le paramÚtre Username et Password. Si le Username n'est pas spécifié, il utilise le nom de l'utilisateur actuel.
function Set-Autologon {
param (
[Parameter(
HelpMessage="Nom d'utilisateur pour l'autologon")]
$Username = $env:USERNAME,
[Parameter(Mandatory=$true,
HelpMessage="Mot de passe de l'utilisateur")]
[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 va activer l'autologon de l'utilisateur."
}
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 "L'autologon a été configuré avec succÚs."
}
L'exécution de ce script se présente comme suit :
Set-Autologon -Password "PlaintextPassword"Comment utiliser
Voyons maintenant comment l'auteur utilise tout cela. Comment correctement déployer un serveur Minecraft public sur Windows. Commençons par le début.
1. Créons un utilisateur
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. Enregistrons une tùche pour exécuter le script
Vous pouvez enregistrer Ă l'aide du module, comme suit :
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MinecraftServer" -TaskName "MinecraftStarter"Ou utiliser les outils standards :
$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. Activez l'autologon et redémarrez la machine
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Fin
L'auteur a créé ce script, entre autres, pour lui-mĂȘme, donc il sera ravi d'entendre vos suggestions pour l'amĂ©liorer. L'auteur espĂšre que tout ce code vous a Ă©tĂ© au moins minimement utile, et que l'article vous a intĂ©ressĂ©.
Source : habr.com
