Minecraft serverini ishga tushirish uchun mukammal skript

Minecraft serverini ishga tushirish uchun mukammal skript

Muallif o'yinni juda yaxshi ko'radi va o'zi "do'stlar uchun" kichik serverning ma'muri. Havaskorlar orasida odatdagidek, serverdagi hamma narsa modifikatsiyalangan va bu beqarorlikka olib keladi va natijada ishdan chiqadi. Powershell muallifi o'z ko'chasidagi do'konlarning joylashuvidan yaxshiroq bilganligi sababli, u shunday qilishga qaror qildi "Minecraft 2020-ni ishga tushirish uchun eng yaxshi skript" Xuddi shu skript shablon uchun asos bo'lib xizmat qildi Ruvds bozori. Ammo barcha manbalar allaqachon maqolada. Endi, tartibda, hammasi qanday amalga oshirilgan.

Bizga kerak bo'lgan buyruqlar

Muqobil jurnallar

Bir kuni, yana bir nechta modlarni o'rnatganimdan so'ng, men server urush e'lon qilmasdan ishlamay qolganini aniqladim. Server last.log yoki disk raskadrovkada xatolar yozmadi va nazariy jihatdan bu xatoni yozib, to'xtatilishi kerak bo'lgan konsol yopildi.

Agar u yozishni istamasa, kerak emas. Bizda cmdlet bilan Powershell bor Tee-ob'ekt, bu ob'ektni oladi va uni bir vaqtning o'zida faylga va konsolga chiqaradi.

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

Shunday qilib, Powershell StandardOutput ni oladi va uni faylga yozadi. Foydalanishga urinmang Boshlash - Jarayonchunki u StandardOutput emas, System.ComponentModel.Componentni qaytaradi va -RedirectStandardOutput konsolga kirishni imkonsiz qiladi, biz bundan qochishimiz kerak.

Argumentlarni ishga tushiring

Xuddi shu modlarni o'rnatgandan so'ng, muallif serverda ham etarli RAM yo'qligini payqadi. Va bu ishga tushirish argumentlarini o'zgartirishni talab qiladi. Har bir inson foydalanadigan start.bat-da ularni har safar o'zgartirish o'rniga, shunchaki ushbu skriptdan foydalaning.

Tee-Object faqat bajariladigan fayl "Xuddi shunday" deb nomlanganida StandardOutput ni o'qiydi, siz boshqa skript yaratishingiz kerak bo'ladi. Ushbu skript Minecraft tomonidan ishga tushiriladi. Keling, argumentlardan boshlaylik.

Kelajakda yakuniy dangasalikka berilish uchun skript tezda ishga tushirish argumentlarini to'plashi kerak. Buning uchun so'nggi versiyani qidirishdan boshlaylik Qurish.

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

Sort-obyektdan foydalanib, biz har doim eng katta raqamga ega bo'lgan ob'ektni olamiz, ulardan qanchasini qo'ysangiz ham. Yakuniy dangasalik.

Endi siz serverga xotira belgilashingiz kerak. Buning uchun tizim xotirasi hajmini oling va uning miqdorini satrga yozing.

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

To'g'ri avtomatik qayta ishga tushirish

Muallif boshqa odamlarning .bat fayllarini ko'rgan, ammo ular server nima uchun to'xtatilganini hisobga olishmagan. Bu noqulay, agar siz mod faylini o'zgartirishingiz yoki biror narsani o'chirishingiz kerak bo'lsa-chi?
Endi to'g'ri qayta ishga tushiramiz. Muallif avvalroq server nima uchun yopilganidan qat'iy nazar serverni qayta ishga tushiradigan g'alati skriptlarga duch keldi. Biz chiqish kodidan foydalanamiz. Java muvaffaqiyat sifatida 0 dan foydalanadi, shuning uchun biz bu erdan raqsga tushamiz.

Birinchidan, agar server muvaffaqiyatsiz bo'lsa, uni qayta ishga tushiradigan funksiya yarataylik.

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

Skript /stop buyrug'i yordamida server o'z konsolidan an'anaviy tarzda o'chirilgunga qadar tsiklda qoladi.

Agar biz hamma narsani avtomatlashtirishga qaror qilsak, unda boshlanish sanasini, tugash sanasini, shuningdek, tugatish sababini to'plash yaxshi bo'lar edi.

Buning uchun Start-Process natijasini o'zgaruvchiga yozamiz. Skriptda bu shunday ko'rinadi:

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

Va keyin natijalarni faylga yozamiz. Bu o'zgaruvchida bizga qaytarilgan narsa:

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

Bularning barchasi Add-Content yordamida faylga qo'shilishi mumkin. Bir oz taroq qilib, biz ushbu skriptni olamiz va uni handler.ps1 deb ataymiz.

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

Endi ishlov beruvchini ishga tushiradigan skript yarataylik.

To'g'ri ishga tushirish

Muallif Minecraft-ning turli xil versiyalarini bitta moduldagi istalgan yo'ldan ishga tushirishni, shuningdek, jurnallarni ma'lum bir papkada saqlashni xohlaydi.

Muammo shundaki, jarayon tizimga kirgan foydalanuvchi tomonidan boshlanishi kerak. Bu ish stoli yoki WinRm orqali amalga oshirilishi mumkin. Agar siz serverni tizim foydalanuvchisi yoki hatto administrator sifatida ishga tushirsangiz, lekin tizimga kirmasangiz, Server.jar hatto eula.txt faylini o'qiy olmaydi va ishga tushmaydi.

Biz ro'yxatga olish kitobiga uchta yozuv qo'shish orqali avtomatik kirishni yoqishimiz mumkin.

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

Bu xavfsiz emas. Login va parol bu erda ochiq matnda ko'rsatilgan, shuning uchun serverni ishga tushirish uchun foydalanuvchi darajasida yoki undan ham torroq guruhda kirish huquqiga ega bo'lgan alohida foydalanuvchi yaratish kerak. Buning uchun standart administratordan foydalanish qat'iyan tavsiya etilmaydi.

Biz avtomatik kirishni tartibga soldik. Endi siz server uchun yangi vazifani ro'yxatdan o'tkazishingiz kerak. Biz Powershell-dan buyruqni ishga tushiramiz, shuning uchun u quyidagicha ko'rinadi:

$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

Modulni yig'ish

Endi hamma narsani keyinroq ishlatilishi mumkin bo'lgan modullarga joylashtiramiz. Tayyor skriptlar uchun barcha kodlar shu yerda, import qiling va foydalaning.

Modullar bilan bezovta qilishni xohlamasangiz, yuqorida tavsiflangan hamma narsani alohida ishlatishingiz mumkin.

Boshlash - Minecraft

Birinchidan, standart chiqishni tinglaydigan va yozib oladigan skriptni ishga tushirishdan boshqa hech narsa qilmaydigan modul yarataylik.

Parametrlar blokida u Minecraft-ni qaysi papkadan ishga tushirishni va jurnalni qaerga qo'yishni so'raydi.

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

Va siz Minecraft-ni quyidagicha ishga tushirishingiz kerak bo'ladi:

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

Endi foydalanishga tayyor Handler.ps1 ga o'tamiz

Skriptimiz chaqirilganda parametrlarni qabul qilishi uchun biz parametr blokini ham belgilashimiz kerak. E'tibor bering, u Oracle Java-da ishlaydi, agar siz boshqa tarqatishdan foydalansangiz, bajariladigan faylga yo'lni o'zgartirishingiz kerak bo'ladi.

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

Ro'yxatdan o'tish - Minecraft

Skript deyarli Start-Minecraft bilan bir xil, faqat yangi vazifani qayd etishdan tashqari. Xuddi shu dalillarni qabul qiladi. Foydalanuvchi nomi, agar ko'rsatilmagan bo'lsa, joriy nomni oladi.

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

Ro'yxatdan o'tish - Avtolog

Parametrlar blokida skript foydalanuvchi nomi va parol parametrlarini qabul qiladi. Agar foydalanuvchi nomi ko'rsatilmagan bo'lsa, joriy foydalanuvchi nomi ishlatiladi.

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

Ushbu skriptni ishga tushirish quyidagicha ko'rinadi:

Set-Autologon -Password "PlaintextPassword"

Qanday foydalanish kerak

Keling, muallifning o'zi bularning barchasidan qanday foydalanishini ko'rib chiqaylik. Windows-da ommaviy Minecraft serverini qanday qilib to'g'ri joylashtirish kerak. Eng boshidan boshlaylik.

1. Foydalanuvchi yarating

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

2. Skriptni ishga tushirish uchun vazifani ro'yxatdan o'tkazing

Siz quyidagi modul yordamida ro'yxatdan o'tishingiz mumkin:

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

Yoki standart vositalardan foydalaning:

$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. Avtomatik kirishni yoqing va mashinani qayta yoqing

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

Tugatish

Muallif ssenariyni, shu jumladan o'zi uchun ham yaratgan, shuning uchun u ssenariyni takomillashtirish bo'yicha takliflaringizni tinglashdan mamnun bo'ladi. Muallif ushbu kodning barchasi siz uchun kamida foydali bo'lganiga umid qiladi va maqola qiziqarli bo'ldi.

Minecraft serverini ishga tushirish uchun mukammal skript

Manba: www.habr.com

a Izoh qo'shish