Le script de lancement de serveur Minecraft parfait



L'auteur aime beaucoup le jeu et il est lui-mĂȘme l'administrateur d'un petit serveur "purement pour les amis". Comme d'habitude chez les amateurs, tout est modulĂ© sur le serveur, et cela entraĂźne l'instabilitĂ© du travail et du fait de la chute. Étant donnĂ© que l'auteur connaĂźt mieux Powershell que l'emplacement des magasins dans sa rue, il a dĂ©cidĂ© de faire "Le meilleur script de lancement de Minecraft 2020 ". Le mĂȘme script a servi de base au modĂšle sur le marchĂ© Ruvds . Mais toutes les sources sont dĂ©jĂ  dans l'article. Maintenant, dans l'ordre, comment tout cela s'est produit.

Nous avons besoin d'Ă©quipes


Journalisation alternative


AprĂšs avoir mis quelques mods de plus, j'ai trouvĂ© que le serveur semblait planter sans dĂ©clarer la guerre. Le serveur n'a pas Ă©crit d'erreurs dans latest.log ou debug, et la console, qui Ă©tait censĂ©e Ă©crire et arrĂȘter cette erreur, a Ă©tĂ© fermĂ©e.

Ne veut pas Ă©crire - pas besoin. Nous avons Powershell avec l' applet de commande Tee-Object , qui prend un objet et l'affiche dans un fichier et dans la console en mĂȘme temps.

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

De cette façon, Powershell récupérera StandardOutput et l'écrira dans un fichier. N'essayez pas d'utiliser Start-Process car il renverra System.ComponentModel.Component, pas StandardOutput, et -RedirectStandardOutput rendra impossible l'accÚs à la console, ce que nous voulons éviter.

Lancer des arguments


En mettant la mĂȘme paire de mods, l'auteur a remarquĂ© que le serveur manque Ă©galement de RAM. Et cela doit changer les arguments de dĂ©marrage. Au lieu de les changer Ă  chaque fois dans start.bat, que tout le monde utilise, utilisez simplement ce script.

Puisque Tee-Object ne lit StandardOutput que lorsque l'exĂ©cutable est appelĂ© «Right So», vous devrez crĂ©er un autre script. Ce script exĂ©cutera Minecraft lui-mĂȘme. Commençons par les arguments.

Afin de se livrer à la paresse ultime à l'avenir, le script doit collecter les arguments de démarrage à la volée. Pour ce faire, commencez par rechercher la derniÚre version de forge .

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

Avec l'aide de sort-object, nous prendrons toujours l'objet avec le plus grand chiffre, peu importe combien vous les y mettez. La paresse ultime.

Vous devez maintenant affecter de la mémoire au serveur. Pour ce faire, prenez la quantité de mémoire systÚme et écrivez sa quantité en 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 ils n'ont pas pris en compte la raison pour laquelle le serveur a Ă©tĂ© arrĂȘtĂ©. Est-il gĂȘnant que si vous avez juste besoin de modifier le fichier mod ou de supprimer quelque chose?
Faisons maintenant le bon redĂ©marrage. L'auteur a prĂ©cĂ©demment rencontrĂ© d'Ă©tranges scripts qui ont redĂ©marrĂ© le serveur malgrĂ© le fait que le serveur s'est arrĂȘtĂ©. Nous utiliserons exitcode. Java utilise 0 comme rĂ©ussite, donc nous danserons.

Créez d'abord une fonction qui redémarrera le serveur s'il ne se termine pas.

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 la boucle jusqu'Ă  ce que le serveur de sa propre console s'arrĂȘte normalement Ă  l'aide de la commande / stop.

Si nous décidions tous d'automatiser, ce serait bien de recueillir la date de lancement, l'achÚvement, ainsi que la raison de l'achÚvement.

Pour ce faire, nous écrivons le résultat Start-Process dans une variable. Dans le script, cela ressemble à ceci:

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

Et puis nous écrivons les résultats dans un fichier. Voici ce qui nous revient dans la variable:

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

Tout cela en utilisant Add-Content peut ĂȘtre ajoutĂ© au fichier. AprĂšs avoir peignĂ© un peu, nous obtenons un tel script, et l'appelons 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

Exécutons maintenant le script avec le lancement du gestionnaire.

DĂ©marrage correct


L'auteur veut qu'un module lance Minecraft de différentes versions à partir de n'importe quel chemin, et puisse également mettre les journaux dans un dossier spécifique.

Le problĂšme est que le processus doit ĂȘtre dĂ©marrĂ© par l'utilisateur qui est sur le systĂšme. Cela peut ĂȘtre fait via le bureau ou WinRm. Si vous dĂ©marrez le serveur au nom du systĂšme ou mĂȘme de l'administrateur, mais que vous ne vous connectez pas, Server.jar ne pourra mĂȘme pas lire eula.txt et dĂ©marrer.

Nous pouvons activer la connexion automatique au systÚme en ajoutant trois entrées au registre.

New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password  -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1 -ErrorAction SilentlyContinue

Ce n'est pas prudent. Le login et le mot de passe sont indiqués ici en texte clair, vous devez donc démarrer un utilisateur individuel qui a accÚs au niveau utilisateur, ou dans un groupe encore plus restreint, pour démarrer le serveur. L'utilisation d'un administrateur standard pour cela est fortement déconseillée.

Avec saisie automatique triée. Vous devez maintenant enregistrer une nouvelle tùche sous le serveur. Nous exécuterons la commande à partir de Powershell, elle ressemblera donc à ceci:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

Assembler le module


Maintenant, transformons tout en modules qui peuvent ĂȘtre utilisĂ©s plus tard. Tout le code des scripts prĂȘts Ă  l'emploi est ici, importez et utilisez.

Vous pouvez utiliser sĂ©parĂ©ment tout ce qui est dĂ©crit ci-dessus si vous ne voulez pas vous embĂȘter avec les modules.

Start-minecraft


Tout d'abord, nous allons créer un module qui ne fera que cela, exécuter un script qui écoutera et enregistrera la sortie standard.

Dans le bloc de paramĂštres, il demande Ă  partir de quel dossier lancer Minecraft et oĂč mettre le journal.

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 vous devrez exécuter minecraft comme ceci:

Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.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, nous devons également spécifier un bloc de paramÚtres. Veuillez noter qu'il démarre Oracle Java, si vous utilisez une distribution différente, vous devrez modifier le chemin d'accÚs au fichier exécutable.

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 files\Oracle\Java\javapath_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

Register-minecraft


Le script rĂ©pĂšte pratiquement Start-Minecraft, sauf qu'il n'enregistre qu'une nouvelle tĂąche. Accepte les mĂȘmes arguments. Le nom d'utilisateur, s'il n'est pas spĂ©cifiĂ©, prend le nom 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

S'inscrire-connexion automatique


Dans le bloc de paramÚtres, le script accepte le paramÚtre Username et Password. Si le nom d'utilisateur n'a pas été spécifié, le nom de l'utilisateur actuel est utilisé.

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:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
 
    if ($null -eq $i) {
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password 
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1
        Write-Verbose "Set-Autologon will enable user auto logon."
 
    }
    else {
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1
    }
 
    
    Write-Verbose "Autologon was set successfully."
 
}

L'exécution de ce script ressemble à ceci:

Set-Autologon -Password "PlaintextPassword"

Comment utiliser


Nous allons maintenant examiner comment l'auteur lui-mĂȘme utilise tout cela. Comment dĂ©ployer le serveur public Minecraft sur Windows. Commençons par le tout dĂ©but.

1. Créez un utilisateur

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

2. Enregistrez la tùche d'exécution du script.

Vous pouvez vous inscrire Ă  l'aide du module, comme suit:

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

Ou utilisez les outils standard:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

3. Activez la connexion automatique au systÚme et redémarrez la machine

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

AchĂšvement


L'auteur a fait le script, y compris pour lui-mĂȘme, par consĂ©quent, il sera heureux d'entendre vos suggestions pour amĂ©liorer le script. L'auteur espĂšre que tout ce code vous a Ă©tĂ© au moins d'une utilitĂ© minimale, et l'article est intĂ©ressant.


All Articles