Mükəmməl Minecraft server başlanğıc skripti

Mükəmməl Minecraft server başlanğıc skripti

Müəllif oyunu çox sevir və özü də "sırf dostlar üçün" kiçik bir serverin administratorudur. Həvəskarlar arasında həmişə olduğu kimi, serverdəki hər şey dəyişdirilir və bu, işin qeyri-sabitliyinə və nəticədə düşməyə səbəb olur. Müəllif Powershell-i küçəsindəki mağazaların yerləşdiyi yerdən daha yaxşı bildiyi üçün bunu etmək qərarına gəldi "Minecraft 2020-ni işə salmaq üçün ən yaxşı skript". Eyni skript şablon üçün əsas kimi xidmət etdi Ruvds bazarı. Amma bütün mənbələr artıq məqalədədir. İndi sıra ilə, hər şey necə edildi.

Bizə lazım olan əmrlər

Alternativ giriş

Daha bir neçə mod quraşdırdıqdan sonra gördüm ki, server, görünür, müharibə elan etmədən çökür. Server ən son.log və ya debug-a səhvlər yazmadı və nəzəri olaraq bu xətanı yazıb dayandırmalı olan konsol bağlandı.

Yazmaq istəmirsinizsə, yazmayın. Bizdə cmdlet ilə Powershell var Tee-Obyekt, hansı obyekti götürür və eyni zamanda fayla və konsola çıxarır.

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

Beləliklə, Powershell StandardOutput-u götürəcək və onu fayla yazacaq. İstifadə etməyə çalışmayın Başlanğıc-Prosesə, çünki o, StandardOutput deyil, System.ComponentModel.Component qaytaracaq və -RedirectStandardOutput konsola yazmağı qeyri-mümkün edəcək, bundan qaçmaq istəyirik.

Arqumentləri işə salın

Eyni cüt modları quraşdırdıqdan sonra müəllif serverdə də kifayət qədər RAM olmadığını gördü. Və işə salınma arqumentlərini dəyişdirmək lazımdır. Hər kəsin istifadə etdiyi start.bat-da onları hər dəfə dəyişmək əvəzinə, sadəcə bu skriptdən istifadə edin.

Tee-Object StandardOutput-u yalnız icra olunan sənəd "Eynən belə" adlandırıldıqda oxuduğu üçün daha bir skript yerinə yetirilməli olacaq. Bu skript Minecraft-ı özü işlədəcək. Arqumentlərdən başlayaq.

Gələcəkdə son tənbəlliyə qapılmaq üçün skript tez bir zamanda başlanğıc arqumentlərini toplamalıdır. Bunun üçün ən son versiyanı axtararaq başlayaq döymək.

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

Sort-obyekt ilə, oraya nə qədər qoymağınızdan asılı olmayaraq, biz həmişə ən çox sayda obyekti götürəcəyik. Son tənbəllik.

İndi serverə yaddaş təyin etməliyik. Bunun üçün sistem yaddaşının həcmini götürüb onun miqdarını sətirə yazırıq.

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

Düzgün avtomatik yenidən başladın

Müəllif digər insanların .bat fayllarını görüb, lakin serverin dayandırılmasının səbəbini nəzərə almadılar. Əlverişsizdir, sadəcə mod faylını dəyişdirmək və ya bir şeyi silmək lazımdırsa?
İndi düzgün yenidən başladın edək. Müəllif daha əvvəl serverin niyə çıxmasından asılı olmayaraq serveri yenidən işə salan qəribə skriptlərlə rastlaşmışdı. Çıxış kodundan istifadə edəcəyik. Java müvəffəqiyyət kimi 0-dan istifadə edir, gəlin oradan rəqs edək.

Əvvəlcə server uğursuz olarsa onu yenidən işə salacaq funksiya yaradaq.

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

Skript server /stop əmrindən istifadə edərək öz konsolundan normal şəkildə çıxana qədər dövrədə qalacaq.

Hər şeyi avtomatlaşdırmaq qərarına gəlsək, o zaman işə salınma tarixini, bitməsini, həmçinin sonun səbəbini toplamaq yaxşı olardı.

Bunun üçün Start-Process nəticəsini dəyişənə yazırıq. Bir skriptdə bu belə görünür:

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

Və sonra nəticələri fayla yazın. Dəyişəndə ​​bizə qaytarılan budur:

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

Bütün bunlar Add-Content istifadə edərək fayla əlavə edilə bilər. Bir az fırçaladıqdan sonra belə bir skript əldə edirik, lakin biz ona handler.ps1 deyirik.

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

İndi işləyicinin işə salınması ilə skripti dizayn edək.

Düzgün avtomatik yükləmə

Müəllif müxtəlif versiyaların Minecraft-ı bir modulla istənilən yoldan idarə etmək, həmçinin qeydləri müəyyən bir qovluğa yerləşdirmək istəyir.

Problem ondadır ki, proses daxil olmuş istifadəçi tərəfindən başlamalıdır. Bu, masaüstü və ya WinRm vasitəsilə edilə bilər. Əgər serveri sistem və ya hətta administrator kimi işlədirsinizsə, lakin daxil olmasanız, o zaman Server.jar hətta eula.txt faylını oxuya və başlaya bilməyəcək.

Reyestrə üç giriş əlavə etməklə avtoloqu aktivləşdirə bilərik.

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 təhlükəsiz deyil. Giriş və parol burada açıq mətnlə göstərilir, buna görə də serveri işə salmaq üçün istifadəçi səviyyəsində və ya daha dar qrupda çıxışı olan ayrıca istifadəçi yaratmalısınız. Bunun üçün standart administratordan istifadə etmək qətiyyən tövsiyə edilmir.

Autologin-i anladıq. İndi server üçün yeni tapşırığı qeydiyyatdan keçirməlisiniz. Biz Powershell-dən əmr işlədəcəyik, buna görə də belə görünəcək:

$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

Modulun yığılması

İndi hər şeyi sonradan istifadə edilə bilən modullarda təşkil edək. Hazır skriptlərin bütün kodları buradadır, idxal və istifadə.

Modullarla narahat olmaq istəmirsinizsə, yuxarıda təsvir edilən hər şeyi ayrıca istifadə edə bilərsiniz.

minecrafta başlayın

Əvvəlcə standart çıxışa qulaq asacaq və yazacaq bir skript işlətməkdən başqa heç nə etməyəcək bir modul yaradaq.

Parametr blokunda o, Minecraft-ın hansı qovluqdan işə salınacağını və jurnalı hara qoyacağını soruşur.

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-ı belə idarə etməli olacaqsınız:

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

İndi istifadəyə hazır Handler.ps1-ə keçək

Çağırılan zaman skriptimizin parametrləri qəbul etməsi üçün biz də parametr blokunu təyin etməliyik. Nəzərə alın ki, o, Oracle Java-da işləyir, əgər fərqli paylamadan istifadə edirsinizsə, icra olunan faylın yolunu dəyişməli olacaqsınız.

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 qeydiyyatdan keçin

Skript praktiki olaraq Start-Minecraft ilə eynidir, yalnız yeni tapşırığı qeyd etməsi istisna olmaqla. Eyni arqumentləri qəbul edir. İstifadəçi adı, müəyyən edilmədikdə, cari adı götürür.

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

Qeydiyyat - Avtoloq

Parametr blokunda skript İstifadəçi adı və Parol parametrlərini qəbul edir. İstifadəçi adı göstərilməyibsə, cari istifadəçinin adı istifadə olunur.

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

Bu skripti işə salmaq belə görünür:

Set-Autologon -Password "PlaintextPassword"

Necə istifadə

İndi müəllifin özünün bütün bunlardan necə istifadə etdiyinə fikir verin. Minecraft ictimai serverini Windows-da necə düzgün yerləşdirmək olar. Ən başdan başlayaq.

1. İstifadəçi yaradın

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

2. Skripti işə salmaq üçün tapşırığı qeydiyyatdan keçirin

Belə bir modulla qeydiyyatdan keçə bilərsiniz:

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

Və ya standart vasitələrdən istifadə edin:

$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. Autologin-i yandırın və maşını yenidən başladın

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

Tamamlama

Müəllif ssenarini, o cümlədən özü üçün hazırladı, buna görə də ssenarinin təkmilləşdirilməsi üçün təkliflərinizi dinləməkdən məmnun olacaq. Müəllif ümid edir ki, bütün bu kodlar sizin üçün ən azı minimal faydalı olub və məqalə maraqlıdır.

Mükəmməl Minecraft server başlanğıc skripti

Mənbə: www.habr.com

Добавить комментарий