Le script parfait pour démarrer un serveur Minecraft.

Le script parfait pour démarrer un serveur Minecraft.

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 le marketplace Ruvds. 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 -Append

Ainsi, 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 1

Avec 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 -PassThru

Ensuite, nous écrivons les résultats dans un fichier. Voici ce que nous retournons dans la variable :

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

Tout 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 SilentlyContinue

C'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 Highest

Assemblons 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-Minecraft

Et 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-Minecraft

Register-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 -UserMayNotChangePassword

2. 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 Highest

3. 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Ă©.

Le script parfait pour démarrer un serveur Minecraft.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster