Идеална скрипта за стартување на серверот Minecraft

Идеална скрипта за стартување на серверот Minecraft

Авторот многу ја сака играта, а тој самиот е администратор на мал сервер „чисто за пријатели“. Како што е вообичаено кај аматерите, сè на серверот е модифицирано, а тоа повлекува нестабилност и, како резултат на тоа, паѓа. Бидејќи авторот на Powershell знае подобро од локацијата на продавниците на неговата улица, тој одлучи да направи "Најдобра скрипта за лансирање на Minecraft 2020 година" Истата скрипта послужи како основа за шаблонот во Рувдс пазар. Но, сите извори се веќе во статијата. Сега, по ред, како сето тоа беше направено.

Командите што ни се потребни

Алтернативна сеча

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

Ако не сака да пишува, не треба. Имаме Powershell со cmdlet Tee-Објект, кој зема објект и го прикажува во датотека и во конзолата во исто време.

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

На овој начин, Powershell ќе го земе StandardOutput и ќе го запише во датотека. Не обидувајте се да користите Почеток-процесбидејќи ќе го врати System.ComponentModel.Component наместо StandardOutput, а -RedirectStandardOutput ќе го оневозможи влегувањето во конзолата, што сакаме да го избегнеме.

Стартувајте аргументи

По инсталирањето на истиот пар модови, авторот забележал дека серверот исто така нема доволно RAM меморија. И ова бара промена на аргументите за лансирање. Наместо да ги менувате секој пат во start.bat, што сите го користат, само користете ја оваа скрипта.

Бидејќи Tee-Object чита само StandardOutput кога извршната датотека се нарекува "Just Like This", ќе треба да направите друга скрипта. Оваа скрипта ќе биде лансирана од самиот 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 датотеки од други луѓе, но тие не ја земале предвид причината зошто серверот бил прекинат. Ова е незгодно, што ако само треба да ја промените датотеката за мод или да избришете нешто?
Сега ајде да направиме правилно рестартирање. Авторот претходно наиде на чудни скрипти кои го рестартираа серверот без оглед на тоа зошто серверот се исклучи. Ќе користиме излезен код. Јава користи 0 како успех, па ќе танцуваме од тука.

Прво, ајде да создадеме функција која ќе го рестартира серверот ако не успее.

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

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

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

За да го направите ова, го запишуваме резултатот од 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"

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

Сега да погледнеме како сето ова го користи самиот автор. Како правилно да распоредите јавен сервер Minecraft на Windows. Да почнеме од самиот почеток.

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

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