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
