Идеална скрипта за покретање Минецрафт сервера

Идеална скрипта за покретање Минецрафт сервера

Аутор веома воли игру, а и сам је администратор малог сервера „чисто за пријатеље“. Као што је уобичајено међу аматерима, све на серверу је модификовано, а то повлачи нестабилност и, као резултат, кварове. Пошто аутор Поверсхелл-а зна боље од локације продавница у својој улици, одлучио је да направи "Најбоља скрипта за покретање Минецрафт-а 2020" Иста скрипта је послужила као основа за шаблон у Рувдс маркетплаце. Али сви извори су већ у чланку. Сада, редом, како је све то урађено.

Команде које су нам потребне

Алтернативно евидентирање

Једног дана, након што сам инсталирао још неколико модова, открио сам да се сервер, очигледно, руши без објаве рата. Сервер није писао грешке у латест.лог или у дебуг, а конзола, која је теоретски требало да упише ову грешку и да се заустави, је затворена.

Ако не жели да пише, не треба. Имамо Поверсхелл са цмдлет-ом Тее-Објецт, који узима објекат и истовремено га шаље у датотеку и на конзолу.

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

На овај начин, Поверсхелл ће покупити СтандардОутпут и записати га у датотеку. Не покушавајте да користите Старт-Процесјер ће вратити Систем.ЦомпонентМодел.Цомпонент а не СтандардОутпут, а -РедирецтСтандардОутпут ће онемогућити улазак у конзолу, што желимо да избегнемо.

Покрени аргументе

Након инсталирања тог истог пара модова, аутор је приметио да сервер такође нема довољно РАМ-а. А ово захтева промену аргумената за покретање. Уместо да их мењате сваки пут у старт.бат-у, који сви користе, само користите ову скрипту.

Пошто Тее-Објецт чита само СтандардОутпут када се извршни фајл зове „Баш овако“, мораћете да направите другу скрипту. Ову скрипту ће покренути сам Минецрафт. Почнимо са аргументима.

Да би се у будућности препустио крајњој лењости, сценарио мора да прикупља аргументе за покретање у ходу. Да бисмо то урадили, почнимо тражењем најновије верзије фалсификовати.

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

Користећи сорт-објецт, увек ћемо узети објекат са највећим бројем, без обзира колико их тамо ставите. Крајња лењост.

Сада морате да доделите меморију серверу. Да бисте то урадили, узмите количину системске меморије и упишите њену количину у низ.

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

Исправно аутоматско поновно покретање

Аутор је видео .бат фајлове од других људи, али они нису узели у обзир разлог зашто је сервер заустављен. Ово је незгодно, шта ако само треба да промените мод фајл или да избришете нешто?
Сада хајде да правилно рестартујемо. Аутор је раније наишао на чудне скрипте које су поново покренуле сервер без обзира зашто се сервер искључио. Користићемо излазни код. Јава користи 0 као успех, тако да ћемо плесати одавде.

Прво, направимо функцију која ће поново покренути сервер ако не успе.

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

Скрипта ће остати у петљи све док се сервер нормално не искључи са сопствене конзоле помоћу команде /стоп.

Ако одлучимо да све аутоматизујемо, онда би било лепо да прикупимо датум почетка, датум завршетка, као и разлог завршетка.

Да бисмо то урадили, уписујемо резултат покретања процеса у променљиву. У скрипти то изгледа овако:

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

И онда записујемо резултате у датотеку. Ово је оно што нам се враћа у променљивој:

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

Све ово се може додати у датотеку користећи Адд-Цонтент. Након што смо га мало прочешљали, добијамо ову скрипту и назовимо је хандлер.пс1.

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

Сада направимо скрипту која покреће руковалац.

Исправно покретање

Аутор жели да покрене различите верзије Минецрафт-а са било које путање у једном модулу, а такође може да складишти евиденције у одређеној фасцикли.

Проблем је у томе што процес мора да покрене корисник који је пријављен на систем. Ово се може урадити преко десктопа или ВинРм-а. Ако покренете сервер као системски корисник или чак администратор, али се не пријавите, онда Сервер.јар неће моћи ни да прочита еула.ткт и покрене.

Можемо омогућити аутоматску пријаву додавањем три уноса у регистар.

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

Није безбедно. Логин и лозинка су овде назначени у отвореном тексту, тако да за покретање сервера морате креирати посебног корисника који има приступ на нивоу корисника или у још ужој групи. Строго се не препоручује коришћење стандардног администратора за ово.

Решили смо аутоматску пријаву. Сада морате да региструјете нови задатак за сервер. Покренућемо команду из Поверсхелл-а, тако да ће изгледати овако:

$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

Састављање модула

Сада ставимо све у модуле који се касније могу користити. Сав код за готове скрипте је овде, увезите и користите.

Све што је горе описано можете користити засебно ако не желите да се мучите са модулима.

Старт-Минецрафт

Прво, направимо модул који неће радити ништа више од покретања скрипте која ће слушати и снимати стандардни излаз.

У блоку параметара он пита из које фасцикле да покрене Минецрафт и где да стави дневник.

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

И мораћете да покренете Минецрафт овако:

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

Сада пређимо на Хандлер.пс1 спреман за употребу

Да би наша скрипта прихватила параметре када се позове, такође морамо да наведемо блок параметара. Имајте на уму да покреће Орацле Јава, ако користите другу дистрибуцију, мораћете да промените путању до извршне датотеке.

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

Регистер-Минецрафт

Скрипта је практично иста као Старт-Минецрафт, само што региструје само нови задатак. Прихвата исте аргументе. Корисничко име, ако није наведено, узима тренутно.

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

Регистер-Аутологон

У блоку параметара, скрипта прихвата параметре Корисничко име и Лозинка. Ако Корисничко име није наведено, користи се име тренутног корисника.

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

Покретање ове скрипте изгледа овако:

Set-Autologon -Password "PlaintextPassword"

Како користити

Погледајмо сада како сам аутор све ово користи. Како правилно поставити јавни Минецрафт сервер на Виндовс. Почнимо од самог почетка.

1. Креирајте корисника

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

2. Региструјте задатак за покретање скрипте

Можете се регистровати помоћу модула попут овог:

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

Или користите стандардне алате:

$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. Омогућите аутоматско пријављивање и поново покрените машину

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

Завршетак

Аутор је направио сценарио, укључујући и за себе, па ће радо саслушати ваше предлоге за побољшање сценарија. Аутор се нада да вам је сав овај код био барем минимално користан, а да је чланак био занимљив.

Идеална скрипта за покретање Минецрафт сервера

Извор: ввв.хабр.цом

Додај коментар