Mükemmel Minecraft sunucusu başlatma betiği

Mükemmel Minecraft sunucusu başlatma betiği

Yazar oyunu çok seviyor ve kendisi de "tamamen arkadaşlara yönelik" küçük bir sunucunun yöneticisi. Amatörler arasında olağan olduğu gibi, sunucudaki her şey modlanmıştır ve bu, istikrarsızlığa ve bunun sonucunda da çökmelere neden olur. Powershell'in yazarı, bulunduğu caddedeki mağazaların konumunu daha iyi bildiğinden, "Minecraft 2020'yi Başlatmak İçin En İyi Senaryo" Aynı komut dosyası şablonun temelini oluşturuyordu. Ruvds pazarı. Ancak tüm kaynaklar zaten makalede var. Şimdi sırasıyla her şeyin nasıl yapıldığını anlatalım.

İhtiyacımız olan komutlar

Alternatif günlük kaydı

Bir gün, birkaç mod daha yükledikten sonra, sunucunun görünüşe göre savaş ilan etmeden çöktüğünü keşfettim. Sunucu, last.log'da veya debug'da hata yazmadı ve teoride bu hatayı yazıp durması gereken konsol kapatıldı.

Yazmak istemiyorsa gerek yok. Cmdlet'li Powershell'imiz var Tee-Nesne, bir nesneyi alır ve onu aynı anda bir dosyaya ve konsola çıkarır.

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

Bu şekilde Powershell StandardOutput'u alıp bir dosyaya yazacaktır. Kullanmaya çalışmayın Başlangıç-Süreççünkü StandardOutput yerine System.ComponentModel.Component değerini döndürecektir ve -RedirectStandardOutput, konsola girmeyi imkansız hale getirecektir ki, kaçınmak istediğimiz şey de budur.

Bağımsız değişkenleri başlat

Aynı mod çiftini yükledikten sonra yazar, sunucunun da yeterli RAM'e sahip olmadığını fark etti. Bu da başlatma argümanlarının değiştirilmesini gerektirir. Herkesin kullandığı start.bat'ta bunları her seferinde değiştirmek yerine bu betiği kullanın.

Tee-Object yalnızca yürütülebilir dosya "Tıpkı Bunun Gibi" olarak adlandırıldığında StandardOutput'u okuduğundan, başka bir komut dosyası oluşturmanız gerekecektir. Bu komut dosyası Minecraft'ın kendisi tarafından başlatılacaktır. Argümanlarla başlayalım.

Gelecekte nihai tembelliğe kapılmak için senaryonun başlatma argümanlarını anında toplaması gerekir. Bunu yapmak için en son sürümü arayarak başlayalım demirhane.

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

sort-object'i kullanarak, oraya kaç tane koyarsanız koyun, her zaman en büyük sayıya sahip nesneyi alırız. Nihai tembellik.

Şimdi sunucuya bellek atamanız gerekiyor. Bunu yapmak için sistem belleği miktarını alın ve miktarını dizeye yazın.

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

Otomatik yeniden başlatmayı düzeltin

Yazar, diğer kişilerin .bat dosyalarını görmüştür ancak sunucunun durdurulma nedenini dikkate almamıştır. Bu sakıncalıdır, ya sadece mod dosyasını değiştirmeniz veya bir şeyi silmeniz gerekiyorsa?
Şimdi uygun bir yeniden başlatma yapalım. Yazar daha önce sunucunun neden kapandığına bakılmaksızın sunucuyu yeniden başlatan garip komut dosyalarıyla karşılaşmıştı. Çıkış kodunu kullanacağız. Java başarı olarak 0'ı kullanır, o yüzden buradan dans edeceğiz.

Öncelikle başarısız olması durumunda sunucuyu yeniden başlatacak bir fonksiyon oluşturalım.

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

Komut dosyası, sunucu /stop komutunu kullanarak kendi konsolundan normal şekilde kapanana kadar döngüde kalacaktır.

Her şeyi otomatikleştirmeye karar verirsek başlangıç ​​tarihini, bitiş tarihini ve ayrıca tamamlanma nedenini toplamak güzel olurdu.

Bunun için Start-Process sonucunu bir değişkene yazıyoruz. Senaryoda şöyle görünüyor:

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

Daha sonra sonuçları bir dosyaya yazıyoruz. Değişkende bize döndürülen şey budur:

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

Bütün bunlar İçerik Ekle kullanılarak bir dosyaya eklenebilir. Biraz taradıktan sonra bu betiği alıyoruz ve buna handler.ps1 adını verelim.

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

Şimdi işleyiciyi başlatan bir komut dosyası oluşturalım.

Doğru başlatma

Yazar, Minecraft'ın farklı sürümlerini tek bir modüldeki herhangi bir yoldan çalıştırmak ve ayrıca günlükleri belirli bir klasörde saklayabilmek istiyor.

Sorun, işlemin sisteme giriş yapan bir kullanıcı tarafından başlatılmasının gerekmesidir. Bu masaüstü veya WinRm aracılığıyla yapılabilir. Sunucuyu sistem kullanıcısı veya yönetici olarak çalıştırırsanız ancak oturum açmazsanız Server.jar, eula.txt dosyasını bile okuyup başlatamayacaktır.

Kayıt defterine üç giriş ekleyerek otomatik girişi etkinleştirebiliriz.

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

Güvenli değil. Kullanıcı adı ve şifre burada düz metin olarak belirtilmiştir, bu nedenle sunucuyu başlatmak için kullanıcı düzeyinde veya daha dar bir grupta erişimi olan ayrı bir kullanıcı oluşturmanız gerekir. Bunun için standart bir yönetici kullanılması kesinlikle önerilmez.

Otomatik giriş işlemini çözdük. Şimdi sunucu için yeni bir görev kaydetmeniz gerekiyor. Komutu Powershell'den çalıştıracağız, böylece şöyle görünecek:

$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

Modülün montajı

Şimdi her şeyi daha sonra kullanılabilecek modüllere yerleştirelim. Hazır scriptlerin tüm kodları burada, içe aktarın ve kullanın.

Modüllerle uğraşmak istemiyorsanız yukarıda anlatılanların hepsini ayrı ayrı kullanabilirsiniz.

Minecraft'ı başlat

Öncelikle standart çıktıyı dinleyecek ve kaydedecek bir betiği çalıştırmaktan başka bir şey yapmayacak bir modül oluşturalım.

Parametreler bloğunda Minecraft'ın hangi klasörden başlatılacağını ve günlüğün nereye yerleştirileceğini sorar.

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

Ve Minecraft'ı şu şekilde başlatmanız gerekecek:

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

Şimdi kullanıma hazır Handler.ps1'e geçelim.

Betiğimizin çağrıldığında parametreleri kabul edebilmesi için ayrıca bir parametre bloğu da belirtmemiz gerekiyor. Lütfen Oracle Java'yı çalıştırdığını, farklı bir dağıtım kullanıyorsanız çalıştırılabilir dosyanın yolunu değiştirmeniz gerekeceğini unutmayın.

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

Kayıt Ol-Minecraft

Komut dosyası, yalnızca yeni bir görevi kaydetmesi dışında pratik olarak Start-Minecraft ile aynıdır. Aynı argümanları kabul ediyor. Kullanıcı adı belirtilmemişse geçerli olanı alı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

Kayıt-Otomatik Oturum Açma

Parametreler bloğunda, komut dosyası Kullanıcı Adı ve Parola parametrelerini kabul eder. Kullanıcı adı belirtilmemişse mevcut kullanıcının adı kullanılır.

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 betiği çalıştırmak şuna benzer:

Set-Autologon -Password "PlaintextPassword"

Nasıl kullanılır?

Şimdi yazarın tüm bunları nasıl kullandığına bakalım. Herkese açık bir Minecraft sunucusunun Windows'ta düzgün şekilde dağıtılması. En baştan başlayalım.

1. Bir kullanıcı oluşturun

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

2. Betiği çalıştırmak için görevi kaydedin

Bunun gibi bir modül kullanarak kayıt olabilirsiniz:

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

Veya standart araçları kullanın:

$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. Otomatik oturum açmayı etkinleştirin ve makineyi yeniden başlatın

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

Tamamlama

Yazar senaryoyu kendisi de dahil olmak üzere hazırladı, bu nedenle senaryoyu geliştirmeye yönelik önerilerinizi dinlemekten mutluluk duyacaktır. Yazar, tüm bu kodun sizin için en azından asgari düzeyde yararlı olduğunu ve makalenin ilginç olduğunu umuyor.

Mükemmel Minecraft sunucusu başlatma betiği

Kaynak: habr.com

Yorum ekle