Ideāls Minecraft servera starta skripts

Ideāls Minecraft servera starta skripts

Autoram ļoti patÄ«k spēle, un viņŔ pats ir neliela servera administrators ā€œtÄ«ri draugiemā€. Kā parasti amatieru vidÅ«, viss serverÄ« tiek modificēts, un tas rada nestabilitāti un rezultātā avārijas. Tā kā Powershell autors zina labāk nekā veikalu atraÅ”anās vietu savā ielā, viņŔ nolēma izveidot "Labākais skripts Minecraft 2020 palaiÅ”anai" Tas pats skripts kalpoja par pamatu veidnei Ruvds tirgus. Bet visi avoti jau ir rakstā. Tagad, kārtÄ«bā, kā tas viss tika darÄ«ts.

Mums vajadzīgās komandas

Alternatīva mežizstrāde

Kādu dienu pēc vēl pāris modifikāciju instalÄ“Å”anas es atklāju, ka serveris, acÄ«mredzot, avarē, nepaziņojot karu. Serveris neierakstÄ«ja kļūdas ne jaunākajā.logā, ne atkļūdoÅ”anā, un konsole, kurai teorētiski vajadzēja ierakstÄ«t Å”o kļūdu un apturēt, tika aizvērta.

Ja viņŔ nevēlas rakstÄ«t, viņam tas nav jādara. Mums ir Powershell ar cmdlet Tee-Object, kas ņem objektu un vienlaikus izvada to failā un konsole.

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

Tādā veidā Powershell paņems standarta izvadi un ierakstÄ«s to failā. Nemēģiniet lietot Sākt-processjo tas atgriezÄ«s System.ComponentModel.Component, nevis StandardOutput, un -RedirectStandardOutput padarÄ«s neiespējamu iekļūŔanu konsolē, no kā mēs vēlamies izvairÄ«ties.

Sāciet argumentus

Pēc tā paÅ”a modifikācijas pāra instalÄ“Å”anas autors pamanÄ«ja, ka serverim arÄ« nav pietiekami daudz RAM. Un tas prasa mainÄ«t palaiÅ”anas argumentus. Tā vietā, lai katru reizi tos mainÄ«tu start.bat, ko izmanto visi, vienkārÅ”i izmantojiet Å”o skriptu.

Tā kā Tee-Object nolasa StandardOutput tikai tad, kad izpildāmā faila nosaukums ir "Just Like This", jums būs jāizveido cits skripts. Šo skriptu palaidīs pats Minecraft. Sāksim ar argumentiem.

Lai turpmāk ļautos galējam slinkumam, skriptam lidojumā ir jāsavāc palaiÅ”anas argumenti. Lai to izdarÄ«tu, sāksim ar jaunākās versijas meklÄ“Å”anu smēde.

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

Izmantojot sort-object, mēs vienmēr paņemsim objektu ar lielāko skaitu neatkarīgi no tā, cik daudz no tiem jūs tur ievietojat. Galīgais slinkums.

Tagad serverim ir jāpieŔķir atmiņa. Lai to izdarÄ«tu, paņemiet sistēmas atmiņas apjomu un ierakstiet tā apjomu virknē.

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

Pareiza automātiskā restartÄ“Å”ana

Autors ir redzējis .bat failus no citiem cilvēkiem, taču viņi nav ņēmuÅ”i vērā iemeslu, kāpēc serveris tika apturēts. Tas ir neērti, ja jums vienkārÅ”i jāmaina mod fails vai kaut kas jāizdzÄ“Å”?
Tagad veiksim pareizu restartÄ“Å”anu. Autors iepriekÅ” saskārās ar dÄ«vainiem skriptiem, kas restartēja serveri neatkarÄ«gi no tā, kāpēc serveris tika izslēgts. Mēs izmantosim izejas kodu. Java izmanto 0 kā veiksmÄ«gu, tāpēc mēs dejosim no Å”ejienes.

Pirmkārt, izveidosim funkciju, kas restartēs serveri, ja tas neizdosies.

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

Skripts paliks cilpā, līdz serveris parasti izslēgsies no savas konsoles, izmantojot komandu /stop.

Ja mēs nolemjam visu automatizēt, tad bÅ«tu jauki savākt sākuma datumu, pabeigÅ”anas datumu un arÄ« pabeigÅ”anas iemeslu.

Lai to izdarÄ«tu, mēs ierakstām Start-Process rezultātu mainÄ«gajā. Skriptā tas izskatās Ŕādi:

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

Un tad mēs ierakstām rezultātus failā. Šis ir tas, kas mums tiek atgriezts mainīgajā:

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

To visu var pievienot failam, izmantojot Add-Content. Nedaudz to izÄ·emmējot, mēs iegÅ«stam Å”o skriptu un sauksim to par 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

Tagad izveidosim skriptu, kas palaiž apdarinātāju.

Pareiza palaiŔana

Autors vēlas palaist dažādas Minecraft versijas no jebkura ceļa vienā modulī, kā arī var saglabāt žurnālus noteiktā mapē.

Problēma ir tāda, ka process ir jāuzsāk lietotājam, kurÅ” ir pieteicies sistēmā. To var izdarÄ«t, izmantojot darbvirsmu vai WinRm. Ja palaižat serveri kā sistēmas lietotājs vai pat administrators, bet nepiesakāties, tad Server.jar pat nespēs nolasÄ«t eula.txt un startēt.

Mēs varam iespējot automātisko pieteikÅ”anos, pievienojot reÄ£istrā trÄ«s ierakstus.

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

Tas nav droÅ”i. PieteikÅ”anās vārds un parole Å”eit ir norādÄ«ti vienkārŔā tekstā, tāpēc, lai palaistu serveri, ir jāizveido atseviŔķs lietotājs, kuram ir piekļuve lietotāja lÄ«menÄ« vai vēl Å”aurākā grupā. Å im nolÅ«kam stingri nav ieteicams izmantot standarta administratoru.

Mēs nokārtojām automātisko pieteikÅ”anos. Tagad jums ir jāreÄ£istrē jauns uzdevums serverim. Mēs izpildÄ«sim komandu no Powershell, tāpēc tā izskatÄ«sies Ŕādi:

$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

Moduļa salikŔana

Tagad saliksim visu moduļos, kurus varēs izmantot vēlāk. Viss gatavu skriptu kods ir Å”eit, importējiet un izmantojiet.

Varat izmantot visu iepriekÅ” aprakstÄ«to atseviŔķi, ja nevēlaties uztraukties ar moduļiem.

Start-Minecraft

Pirmkārt, izveidosim moduli, kas nedarīs neko vairāk, kā tikai palaidīs skriptu, kas klausīsies un ierakstīs standarta izvadi.

Parametru blokā viņŔ jautā, no kuras mapes palaist Minecraft un kur ievietot žurnālu.

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

Un jums būs jāpalaiž Minecraft Ŕādi:

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

Tagad pāriesim uz lietoŔanai gatavu Handler.ps1

Lai mÅ«su skripts pieņemtu parametrus, kad tas tiek izsaukts, mums ir jānorāda arÄ« parametru bloks. LÅ«dzu, ņemiet vērā, ka tajā darbojas Oracle Java. Ja izmantojat citu izplatÄ«Å”anu, jums bÅ«s jāmaina ceļŔ uz izpildāmo failu.

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

Reģistrēties - Minecraft

Skripts ir praktiski tāds pats kā Start-Minecraft, izņemot to, ka tas reÄ£istrē tikai jaunu uzdevumu. Pieņem tos paÅ”us argumentus. Lietotājvārds, ja tas nav norādÄ«ts, aizņem paÅ”reizējo.

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

Reģistrēties-Autologon

Parametru blokā skripts pieņem Lietotājvārda un Paroles parametrus. Ja lietotājvārds nav norādÄ«ts, tiek izmantots paÅ”reizējā lietotāja vārds.

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."
 
}

Šī skripta palaiŔana izskatās Ŕādi:

Set-Autologon -Password "PlaintextPassword"

Kā lietot

Tagad paskatÄ«simies, kā pats autors to visu izmanto. Kā pareizi izvietot publisku Minecraft serveri operētājsistēmā Windows. Sāksim no paÅ”a sākuma.

1. Izveidojiet lietotāju

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

2. Reģistrējiet uzdevumu, lai palaistu skriptu

JÅ«s varat reÄ£istrēties, izmantojot Ŕādu moduli:

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

Vai arī izmantojiet standarta rīkus:

$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. Iespējojiet automātisko pieteikÅ”anos un restartējiet iekārtu

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

PabeigŔana

Scenāriju veidojis autors, arÄ« sev, tāpēc ar prieku uzklausÄ«s jÅ«su ieteikumus scenārija uzlaboÅ”anai. Autors cer, ka viss Å”is kods jums vismaz minimāli noderēja un raksts bija interesants.

Ideāls Minecraft servera starta skripts

Avots: www.habr.com

Pievieno komentāru