Täydellinen Minecraft-palvelimen käynnistysskripti

Täydellinen Minecraft-palvelimen käynnistysskripti

Kirjoittaja rakastaa peliä erittäin paljon, ja hän itse on pienen palvelimen ylläpitäjä "puhtaasti ystäville". Kuten amatöörien keskuudessa tavallista, kaikki palvelimella on modifioitua, mikä johtaa työn epävakauteen ja seurauksena kaatumiseen. Koska kirjoittaja tuntee Powershellin paremmin kuin kauppojen sijainnit kadullaan, hän päätti tehdä "Paras käsikirjoitus Minecraft 2020:n käynnistämiseen". Sama skripti toimi pohjana mallille Ruvdsin markkinapaikka. Mutta kaikki lähteet ovat jo artikkelissa. Nyt järjestyksessä, miten se kaikki tehtiin.

Tarvitsemme komennot

Vaihtoehtoinen kirjaus

Kun asensin vielä pari modia, huomasin, että palvelin ilmeisesti kaatui julistamatta sotaa. Palvelin ei kirjoittanut virheitä latest.logiin tai debugiin, ja konsoli, jonka teoriassa piti kirjoittaa tämä virhe ja pysähtyä, suljettiin.

Jos et halua kirjoittaa, älä kirjoita. Meillä on Powershell cmdletillä Tee-Object, joka ottaa objektin ja tulostaa sen tiedostoon ja konsoliin samanaikaisesti.

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

Joten Powershell poimii StandardOutput ja kirjoittaa sen tiedostoon. Älä yritä käyttää Aloitusprosessi, koska se palauttaa System.ComponentModel.Component, ei StandardOutput, ja -RedirectStandardOutput tekevät mahdottomaksi kirjoittaa konsoliin, mitä haluamme välttää.

Käynnistä Argumentit

Asennuksen jälkeen samat modit kirjoittaja huomasi, että palvelimella ei myöskään ollut tarpeeksi RAM-muistia. Ja tämä edellyttää käynnistysargumenttien muuttamista. Sen sijaan, että muuttaisit niitä joka kerta start.batissa, jota kaikki käyttävät, käytä vain tätä komentosarjaa.

Koska Tee-Object lukee StandardOutput vain, kun suoritettavaa tiedostoa kutsutaan "Just like that", yksi lisäskripti on tehtävä. Tämä skripti ajaa itse minecraftia. Aloitetaan argumenteista.

Voidakseen nauttia äärimmäisestä laiskuudesta tulevaisuudessa, käsikirjoituksen on kerättävä laukaisuargumentteja lennossa. Aloitetaan etsimällä uusin versio väärentää.

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

Lajittele-objektilla otamme aina suurimman numeron omaavan kohteen riippumatta siitä, kuinka monta sinne laitat. Loputonta laiskuutta.

Nyt meidän on määritettävä muisti palvelimelle. Tätä varten otamme järjestelmämuistin määrän ja kirjoitamme sen määrän merkkijonoon.

$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"

Oikea automaattinen uudelleenkäynnistys

Kirjoittaja on nähnyt .bat-tiedostoja muilta ihmisiltä, ​​mutta he eivät huomioineet palvelimen pysäyttämisen syytä. Se on hankalaa, entä jos sinun tarvitsee vain muuttaa mod-tiedostoa tai poistaa jotain?
Tehdään nyt kunnollinen uudelleenkäynnistys. Kirjoittaja törmäsi aiemmin outoihin komentosarjoihin, jotka käynnistivät palvelimen uudelleen riippumatta siitä, miksi palvelin poistui. Käytämme poistumiskoodia. Java käyttää nollaa menestyksenä, joten tanssitaan siitä eteenpäin.

Luodaan ensin toiminto, joka käynnistää palvelimen uudelleen, jos se epäonnistuu.

function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Write-Log
            Restart-Minecraft
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}

Komentosarja pysyy silmukassa, kunnes palvelin poistuu normaalisti omasta konsolistaan ​​/stop-komennolla.

Jos päätimme automatisoida kaiken, olisi mukava kerätä julkaisupäivä, lopetus ja myös lopettamisen syy.

Tätä varten kirjoitamme Start-Processin tuloksen muuttujaan. Skriptissä se näyttää tältä:

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

Ja sitten kirjoita tulokset tiedostoon. Tässä on se, mitä meille palautetaan muuttujana:

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

Kaikki tämä voidaan lisätä tiedostoon Add-Content-toiminnolla. Hieman harjaamalla saamme tällaisen skriptin, mutta kutsumme sitä handler.ps1:ksi.

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

Suunnitellaan nyt käsikirjoitus käsittelijän käynnistämisen kanssa.

Oikea automaattilataus

Kirjoittaja haluaa ajaa eri versioiden minecraftia mistä tahansa polusta yhdellä moduulilla ja pystyä myös sijoittamaan lokit tiettyyn kansioon.

Ongelmana on, että sisäänkirjautuneen käyttäjän on aloitettava prosessi. Tämä voidaan tehdä työpöydän tai WinRm:n kautta. Jos käytät palvelinta järjestelmänä tai jopa järjestelmänvalvojana, mutta et kirjaudu sisään, Server.jar ei edes pysty lukemaan eula.txt-tiedostoa ja käynnistämään sitä.

Voimme ottaa automaattisen sisäänkirjautumisen käyttöön lisäämällä kolme merkintää rekisteriin.

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

Se ei ole turvallista. Kirjautumistunnus ja salasana ilmoitetaan tässä selkeällä tekstillä, joten palvelimen käynnistämiseksi sinun on luotava erillinen käyttäjä, jolla on käyttöoikeus käyttäjätasolla tai vielä suppeammassa ryhmässä. Vakiojärjestelmänvalvojan käyttämistä tähän ei suositella.

Selvitimme automaattisen sisäänkirjautumisen. Nyt sinun on rekisteröitävä uusi tehtävä palvelimelle. Suoritamme komennon Powershellistä, joten se näyttää tältä:

$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

Moduulin kokoaminen

Järjestetään nyt kaikki moduuleiksi, joita voidaan käyttää myöhemmin. Kaikki valmiiden skriptien koodi on täällä, tuo ja käytä.

Voit käyttää kaikkea yllä kuvattua erikseen, jos et halua vaivautua moduuleiden kanssa.

aloita minecraft

Tehdään ensin moduuli, joka ei tee muuta kuin ajaa komentosarjan, joka kuuntelee ja kirjoittaa standardilähtöön.

Parametrilohkossa hän kysyy, mistä kansiosta minecraft käynnistetään ja mihin loki sijoitetaan.

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

Ja sinun on suoritettava minecraft näin:

Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"

Siirrytään nyt käyttövalmiin Handler.ps1:een

Jotta skriptimme voi hyväksyä parametreja kutsuttaessa, meidän on myös määritettävä parametrilohko. Huomaa, että se käyttää Oracle Javaa. Jos käytät eri jakelua, sinun on vaihdettava suoritettavan tiedoston polku.

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 filesOracleJavajavapath_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

rekisteröi minecraft

Käsikirjoitus on käytännössä sama kuin Start-Minecraft, paitsi että se rekisteröi vain uuden tehtävän. Hyväksyy samat väitteet. Jos käyttäjätunnusta ei ole määritetty, se ottaa nykyisen tunnuksen.

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

Rekisteröidy - Autologon

Parametrilohkossa komentosarja hyväksyy käyttäjätunnus- ja salasanaparametrit. Jos käyttäjätunnusta ei ole määritetty, käytetään nykyisen käyttäjän nimeä.

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: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 will enable user auto logon."
 
    }
    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 "Autologon was set successfully."
 
}

Tämän skriptin suorittaminen näyttää tältä:

Set-Autologon -Password "PlaintextPassword"

Kuinka käyttää

Mieti nyt, kuinka kirjoittaja itse käyttää tätä kaikkea. Kuinka ottaa Minecraft-julkinen palvelin oikein käyttöön Windowsissa. Aloitetaan aivan alusta.

1. Luo käyttäjä

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

2. Rekisteröi tehtävä komentosarjan suorittamiseksi

Voit rekisteröityä moduuliin seuraavasti:

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

Tai käytä vakiotyökaluja:

$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. Kytke automaattinen sisäänkirjautuminen päälle ja käynnistä kone uudelleen

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

Valmistuminen

Kirjoittaja teki käsikirjoituksen, myös itselleen, joten hän kuuntelee mielellään ehdotuksiasi käsikirjoituksen parantamiseksi. Kirjoittaja toivoo, että kaikki tämä koodi oli sinulle ainakin vähän hyödyllinen, ja artikkeli on mielenkiintoinen.

Täydellinen Minecraft-palvelimen käynnistysskripti

Lähde: will.com

Lisää kommentti