Minecraft серверін іске қосудың тамаша сценарийі

Minecraft серверін іске қосудың тамаша сценарийі

Автор ойынды өте жақсы көреді және өзі «таза достарға арналған» шағын сервердің әкімшісі. Әуесқойлар арасында әдеттегідей, сервердегі барлық нәрсе модификацияланған, бұл тұрақсыздықты тудырады және нәтижесінде бұзылады. Powershell авторы өз көшесіндегі дүкендердің орналасуын жақсы білетіндіктен, ол жасауды шешті «Minecraft 2020 іске қосу үшін ең жақсы сценарий" Сол сценарий үлгі үшін негіз болды Ruvds базары. Бірақ барлық дереккөздер қазірдің өзінде мақалада. Енді, ретімен, бәрі қалай жасалды.

Бізге қажет командалар

Баламалы журнал жүргізу

Бір күні тағы бірнеше мод орнатқаннан кейін мен сервер соғыс жарияламай-ақ бұзылып жатқанын білдім. Сервер latest.log немесе отладта қателерді жазбады, ал теорияда осы қатені жазып, тоқтауы тиіс консоль жабылды.

Жазғысы келмесе, жазудың қажеті жоқ. Бізде командлеті бар Powershell бар Tee-объект, ол нысанды алып, оны файлға және консольге бір уақытта шығарады.

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

Осылайша, Powershell StandardOutput параметрін алып, оны файлға жазады. Қолдануға тырыспаңыз Бастау-процесссебебі ол StandardOutput емес System.ComponentModel.Component қайтарады және -RedirectStandardOutput консольге кіруді мүмкін емес етеді, бұл біз аулақ болғымыз келеді.

Аргументтерді іске қосыңыз

Дәл сол жұпты орнатқаннан кейін автор серверде жедел жады жеткіліксіз екенін байқады. Және бұл іске қосу аргументтерін өзгертуді талап етеді. Барлығы қолданатын 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

Модульді құрастыру

Енді бәрін кейінірек пайдалануға болатын модульдерге салайық. Дайын сценарийлердің барлық коды осында, импорттаңыз және пайдаланыңыз.

Модульдермен алаңдағыңыз келмесе, жоғарыда сипатталғандардың барлығын бөлек пайдалануға болады.

Бастау - 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 серверін іске қосудың тамаша сценарийі

Ақпарат көзі: www.habr.com

пікір қалдыру