Minecraft серверин баштоо үчүн идеалдуу сценарий

Minecraft серверин баштоо үчүн идеалдуу сценарий

Автор оюнду абдан жакшы көрөт жана өзү "достор үчүн" кичинекей сервердин администратору. Адаттагыдай эле ышкыбоздордо серверде бардыгы модификацияланган, бул туруксуздукка алып келет жана натыйжада кыйроого учурайт. Powershell автору өзүнүн көчөсүндөгү дүкөндөрдүн жайгашкан жеринен жакшыраак билгендиктен, ал жасоону чечти "Minecraft 2020 ишке киргизүү үчүн мыкты сценарий" Ошол эле скрипт шаблон үчүн негиз болуп кызмат кылган Ruvds базары. Бирок бардык булактар ​​макалада мурунтан эле бар. Эми мунун баары кантип жасалганын ирети менен.

Бизге керектүү буйруктар

Альтернативдик каттоо

Бир күнү, дагы бир нече модулдарды орноткондон кийин, мен сервер согуш жарыялабай эле бузулуп жатканын байкадым. Сервер latest.log же мүчүлүштүктөрдү оңдоодо каталарды жазган жок жана теориялык жактан бул катаны жазып, токтошу керек болгон консол жабылды.

Жазгысы келбесе, кереги жок. Бизде cmdlet менен Powershell бар Tee-Object, ал объектти алып, аны бир эле учурда файлга жана консолго чыгарат.

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

Ошентип, Powershell StandardOutputту алып, аны файлга жазат. Колдонууга аракет кылбаңыз баштоо процессианткени ал StandardOutput эмес, System.ComponentModel.Component кайтарып берет, жана -RedirectStandardOutput консолго кирүү мүмкүн эмес кылат, биз качкыбыз келген нерсе.

Аргументтерди ишке киргизүү

Ошол эле жуп модулдарды орноткондон кийин, автор серверде да RAM жетишсиз экенин байкаган. Жана бул ишке киргизүү аргументтерин өзгөртүүнү талап кылат. Баары колдонгон start.bat сайтында аларды ар дайым өзгөртүүнүн ордуна, жөн гана ушул скриптти колдонуңуз.

Tee-Object аткарылуучу файл "Ушундай эле" деп аталганда гана StandardOutput окуй тургандыктан, сиз башка скрипт жасашыңыз керек болот. Бул скрипт Minecraft өзү тарабынан ишке ашырылат. Келгиле, аргументтер менен баштайлы.

Келечекте эң жалкоолукка баруу үчүн, скрипт учуу боюнча аргументтерди чогултушу керек. Бул үчүн, эң акыркы версиясын издөө менен баштайлы бурмалоо.

$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"

Туура автоматтык кайра иштетүү

Автор башка адамдардын .bat файлдарын көргөн, бирок алар сервердин токтоп калган себебин эске алышкан эмес. Бул ыңгайсыз, эгер сизге жөн гана мод файлын өзгөртүү же бир нерсени жок кылуу керек болсочы?
Эми туура кайра иштетели. Автор буга чейин сервер эмне үчүн өчүрүлгөнүнө карабастан серверди кайра иштеткен кызыктай скрипттерге туш болгон. Биз чыгуу кодун колдонобуз. Java ийгилик катары 0 колдонот, ошондуктан биз ушул жерден бийлейбиз.

Биринчиден, эгер ал иштебей калса, серверди кайра иштете турган функцияны түзөлү.

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

Скрипт /stop буйругун колдонуу менен сервер өзүнүн консолунан кадимкидей өчмөйүнчө циклде кала берет.

Эгерде биз бардыгын автоматташтырууну чечсек, анда башталышын, бүтүрүү күнүн, ошондой эле бүтүрүүнүн себебин чогултсак жакшы болмок.

Бул үчүн биз Start-Process натыйжасын өзгөрмөгө жазабыз. Сценарийде мындай көрүнөт:

$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

Мунун баарын Add-Content аркылуу файлга кошууга болот. Аны бир аз тарагандан кийин, биз бул сценарийди алабыз жана аны 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

Эми иштеткичти ишке киргизген скрипт түзөлү.

Туура баштоо

Автор Minecraftтын ар кандай версияларын бир модулда каалаган жолдон иштеткиси келет, ошондой эле журналдарды белгилүү бир папкада сактай алат.

Көйгөй процессти системага кирген колдонуучу башташы керек. Бул иш тактасы же WinRm аркылуу жасалышы мүмкүн. Эгер сиз серверди системанын колдонуучусу же администратор катары иштетсеңиз, бирок кирбесеңиз, анда Server.jar eula.txt файлын окуп, баштай албайт.

Биз реестрге үч жазууну кошуу менен автоматтык кирүү мүмкүнчүлүгүн иштете алабыз.

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

Бул коопсуз эмес. Логин жана сырсөз бул жерде ачык текстте көрсөтүлгөн, андыктан серверди ишке киргизүү үчүн колдонуучу деңгээлинде же андан да тар топко кирүү мүмкүнчүлүгү бар өзүнчө колдонуучуну түзүшүңүз керек. Бул үчүн стандарттуу администраторду колдонуу сунушталбайт.

Биз авто-логинди иреттеп алдык. Эми сиз сервер үчүн жаңы тапшырманы катташыңыз керек. Биз Powershellден буйрукту иштетебиз, ошондуктан ал төмөнкүдөй болот:

$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

Модулду чогултуу

Эми баарын кийинчерээк колдонула турган модулдарга салалы. Даяр скрипттердин бардык коду бул жерде, импорттоо жана колдонуу.

Модулдар менен убара болгуңуз келбесе, жогоруда сүрөттөлгөн нерселердин бардыгын өзүнчө колдоно аласыз.

Start-Minecraft

Биринчиден, стандарттык натыйжаны угуп жана жаза турган скриптти иштетүүдөн башка эч нерсе кыла турган модулду түзөлү.

Параметрлер блогунда ал Minecraftты кайсы папкадан баштоону жана журналды кайда коюуну сурайт.

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

Жана сиз Minecraftты төмөнкүдөй ишке киргизишиңиз керек:

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

Эми колдонууга даяр Handler.ps1ге өтөбүз

Чакырганда скриптибиз параметрлерди кабыл алышы үчүн, биз параметр блогун да көрсөтүшүбүз керек. Көңүл буруңуз, ал Oracle Java иштетет, эгерде сиз башка дистрибуцияны колдонуп жатсаңыз, аткарылуучу файлдын жолун өзгөртүүгө туура келет.

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

Катталуу-Minecraft

Скрипт Start-Minecraft менен дээрлик бирдей, бирок ал жаңы тапшырманы гана каттайт. Ошол эле аргументтерди кабыл алат. Колдонуучунун аты, эгер көрсөтүлбөсө, учурдагыны алат.

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"

Кантип пайдалануу керек

Эми мунун баарын автор өзү кантип пайдаланып жатканын карап көрөлү. Windows'до коомдук Minecraft серверин кантип туура жайгаштыруу керек. Эң башынан баштайлы.

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"

айактоо

Автор сценарийди, анын ичинде өзү үчүн да жасаган, ошондуктан ал сценарийди жакшыртуу боюнча сиздин сунуштарыңызды угууга кубанычта болот. Автор бул коддун баары сизге эң аз дегенде пайдалуу болду жана макала кызыктуу болду деп үмүттөнөт.

Minecraft серверин баштоо үчүн идеалдуу сценарий

Source: www.habr.com

Комментарий кошуу