Minecraft серверийг эхлүүлэх хамгийн тохиромжтой скрипт

Minecraft серверийг эхлүүлэх хамгийн тохиромжтой скрипт

Зохиолч энэ тоглоомд маш их дуртай бөгөөд өөрөө "цэвэр найзууддаа зориулсан" жижиг серверийн администратор юм. Сонирхогчдын дунд ердийнх шиг сервер дээрх бүх зүйл өөрчлөгддөг бөгөөд энэ нь тогтворгүй байдалд хүргэж, улмаар эвдрэлд хүргэдэг. Powershell-ийн зохиогч өөрийн гудамжинд байгаа дэлгүүрүүдийн байршлыг илүү сайн мэддэг тул тэрээр "Minecraft 2020-ыг эхлүүлэх шилдэг скрипт" Үүнтэй ижил скрипт нь загварт үндэс суурь болсон Рувдс зах. Гэхдээ бүх эх сурвалжууд аль хэдийн нийтлэлд байна. Одоо бүх зүйл хэрхэн хийгдсэнийг дарааллаар нь авч үзье.

Бидэнд хэрэгтэй командууд

Альтернатив бүртгэл

Нэг өдөр дахиад хэд хэдэн мод суулгасны дараа сервер дайн зарлаагүй байж байгаад эвдэрч байгааг олж мэдэв. Сервер latest.log эсвэл дибаг дээр алдаа бичээгүй бөгөөд онолын хувьд энэ алдааг бичээд зогсох ёстой байсан консол хаагдсан.

Хэрэв тэр бичихийг хүсэхгүй бол бичих шаардлагагүй. Бидэнд cmdlet-тэй Powershell байна Tee-объект, энэ нь объектыг авч файл болон консол руу нэгэн зэрэг гаргадаг.

.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

Sort-object-ийг ашигласнаар та хэдийг нь тавьсан ч хамаагүй бид хамгийн их тоотой объектыг авах болно. Эцсийн залхуурал.

Одоо та серверт санах ойг хуваарилах хэрэгтэй. Үүнийг хийхийн тулд системийн санах ойн хэмжээг авч, түүний хэмжээг мөрөнд бичнэ үү.

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

Зөв автоматаар дахин эхлүүлэх

Зохиогч нь бусад хүмүүсийн .bat файлуудыг харсан боловч сервер яагаад зогссоныг харгалзан үзээгүй. Энэ нь тохиромжгүй, хэрэв та зүгээр л mod файлыг өөрчлөх эсвэл ямар нэг зүйлийг устгах шаардлагатай бол яах вэ?
Одоо зөв дахин эхлүүлцгээе. Зохиогч өмнө нь сервер яагаад унтарснаас үл хамааран серверийг дахин эхлүүлсэн хачирхалтай скриптүүдтэй таарч байсан. Бид гарах кодыг ашиглах болно. 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"

Яаж хэрэглэх вэ

Одоо зохиолч өөрөө энэ бүхнийг хэрхэн ашиглаж байгааг харцгаая. Олон нийтийн 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

сэтгэгдэл нэмэх