Ideal Minecraft serverini başlatma skripti

Ideal Minecraft serverini başlatma skripti

Müəllif oyunu çox sevir və özü də kiçik bir "yalnız dostlar üçün" serverin administratorudur. Həyat boyunca bu cür oyunsevərlərdə olduğu kimi, serverdə hər şey modifikasiyaya uğrayıb, bu da işin qeyri-sabit olmasına və nəticədə aşırmalara səbəb olur. Müəllif Powershell-i, mağazaların küçədə harada olduğunu bilməkdən daha yaxşı tanıdığına görə, "2020-ci ilin Minecraft üçün Ən Yaxşı Skripti" Bu skript, Ruvds marketpleysindəki şablonun əsası oldu. Lakin bütün mənbələr artıq məqalədə var. İndi isə, ardıcıllığı ilə necə edildiyini nəzərdən keçirək.Lazım olan komandalar

Alternativ loglama

Bir dəfə daha bir neçə modqurğusu quraşdırarkən, serverin görünür, savaş açmadan çökdüyünü aşkar etdim. Server latest.log və ya debug-da heç bir səhv yazmırdı, konsol isə bu səhvi yazmalı və dayanmalı olduğu halda, bağlanmışdı.

Yazmaq istəmirsə – lazımdır. Bizdə, ".handler.ps1 | Tee-Object .StandardOutput.txt -Append

olan Powershell var, bu da obyekt götürərək onu fayla və konsola eyni anda çıxarır. Beləliklə, Powershell StandardOutput-u götürəcək və onu faylda qeyd edəcək. "Start-Process"-dən istifadə etməyin, çünki bu, System.ComponentModel.Component qaytaracaq, StandardOutput deyil, və -RedirectStandardOutput, konsolda girişin mümkünlüyünü dayandıracaq, bundan qaçmaq istəyirik.Başlanğıc arqumentləri

Müəllif o cür modqurğularını quraşdıran zaman serverin, həmçinin, operativ yaddaşın çatışmadığını gördüm. Bunu dəyişdirmək üçün başlama arqumentlərini dəyişmək lazımdır. Hər dəfə start.bat faylında onları dəyişmək əvəzinə, yalnız bu skripti istifadə edin.

Tee-Object yalnız icra olunan fayl birbaşa çağırılarkən StandardOutput-u oxuduğuna görə, bir daha bir skript yazmalıyıq. Bu skript Minecraft-ı işə salacaq. Başlayırıq başlanğıc arqumentlərindən. Gələcəkdə mükəmməl tənbəlliyə daldığımız üçün, skript başlama arqumentlərini hərtərəfli toplamalıdır. Bunu etmək üçün, son versiyanı axtara başlayacağıqforge

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

Sort-Object vasitəsilə biz həmişə ən böyük ədədi götürəcəyik, qoyduğunuz sayda nə olursa olsun. Mükəmməl tənbəllik.

İndi serverə yaddaş ayırmalıyıq. Bunun üçün sistem yaddaşının sayını götürür və onun cəmini string-ə 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şlama.

Müəllif başqalarının .bat fayllarını görmüşdü, lakin onlarda serverin niyə dayandırdığını nəzərə almamışdılar. Yalnız bir mod faylını dəyişmək və ya bir şey silmək lazım olarsa, bu narahatdır.

İndi düzgün yenidən başlama edək. Müəllif əvvəllər serveri, onun hansı səbəbdən dayandırıldığına baxmayaraq, yenidən başlatmağa çalışan maraqlı skriptlərə rast gəldi. Biz isə, exitcode istifadə edəcəyik. Java 0-ı müvəffəqiyyətli tamamlanma kimi qəbul edir, buna görə də bunu istifadə edəcəyik.

İndi serverə yaddaş təyin etmək lazımdır. Bunun üçün sistem yaddaşının sayını götürüb, onun cəmini stringə 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ılma

Müəllif başqalarının .bat fayllarını görüb, amma onların serverin niyə dayandığını nəzərə almadıqlarını görüb. Mod faylını dəyişmək və ya bir şeyi silmək lazım olanda bu narahatdır.
İndi düzgün yenidən başlamaya keçək. Müəllif əvvəl qəribə skriptlərə rast gəlib ki, bu skriptlər serveri onun dayandırılma səbəbindən asılı olmayaraq yenidən başladırdı. Biz çıxış kodunu istifadə edəcəyik. Java, 0-ı uğurlu başa çatma kimi istifadə edir, elə buna görə də bu prinsipdən istifadə edəcəyik.

İlk olaraq, serverin uğursuz dayandığı halda yenidən başladacaq bir 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)
    
}

Skriptdə server, öz konsolundan normal işini dayandırana qədər döngədə qalacaq, bu komanda ilə: /stop.

Əgər bütün bunları avtomatlaşdırmağa qərar vermişiksə, o zaman işə başlama tarixi, bitiş tarixi və bitiş səbəbini də toplamaq yaxşı olardı.

Bunun üçün Start-Process nəticəsini bir dəyişkəndə qeyd edirik. 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

Sonra isə nəticələri bir faylda qeyd edirik. Bizə bu dəyişkəndə belə geri dönülür:

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

Bütün bunları Add-Content ilə fayla əlavə edə bilərik. Bir az daraldaraq, belə bir skript alırıq və buna handler.ps1 deyəcəyik.

Add-Content -Value "Başlama vaxtı:" -Path $Logfile 
$global:Process.StartTime
 
Add-Content -Value "Çıxış kodu:" -Path $Logfile 
$global:Process.ExitCode | Add-Content $Logfile
    
Add-Content -Value "Çıxış vaxtı:" -Path $Logfile 
$global:Process.ExitTime | Add-Content $Logfile

İndi handler skriptini yaradaq.

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

Müəllif müxtəlif versiyalardan Minecraft-ı istənilən yerdən başlatmaq üçün bir modul yaratmaq istəyir, həmçinin logları spesifik bir qovluğa yığmaq imkanı da olmalıdır.

Problemin mərkəzində odur ki, prosesi sistemdə olan istifadəçi başlatmalıdır. Bu, masaüstü və ya WinRm vasitəsilə edilə bilər. Əgər serveri sistem və ya hətta administrator adıyla başlatsaq, lakin sistemə daxil olmazsa, Server.jar eula.txt faylını oxuya bilməyəcək və işə başlamayacaq.

Sistemdə avtomatik giriş etmək üçün üç qeyd əlavə etməklə bunu edə 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. İstifadəçi adı və parol burada düz mətndə göstərilir, bu səbəbdən serveri başlatmaq üçün yalnız istifadəçi səviyyəsində, ya da daha dar qrupda olan ayrı bir istifadəçi yaratmaq lazımdır. Standart administratoru bunun üçün istifadə etmək qətiyyən tövsiyə edilmir.

Avtomatik girişdə problem qalmadı. İndi server üçün yeni bir vəzifə qeyd etmək lazımdır. Bu, Powershell-dən komanda verərək başlayacaq, 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

Modul yaradırıq.

İndi bütün bunları sonradan istifadə edə biləcəyimiz modullara formatlayaq. Burada hazır skriptlərin bütün kodu var, idxal edin və istifadə edin.

Yuxarıda qeyd olunanları ayrıca istifadə edə bilərsiniz, əgər modullarla məşğul olmaq istəmirsinizsə.

Start-Minecraft

Əvvəlcə, yalnız skripti işə salacaq bir modul edək ki, bu modul standardoutput-u dinləsin və qeyd etsin.

Parametrlər blokunda minecraft-ı hansı folddan işə salacaqsınız və logun haraya yazılacağı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ə işə salmaq lazım olacaq:

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

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

Skripti çağırarkən parametrləri qəbul edə bilməsi üçün parametr blokunu da göstərmək lazımdır. Diqqət edin, Oracle Java-nı işə salır, əgər siz başqa bir paylanmanı istifadə edirsinizsə, icra faylının yolunu dəyişdirməlisiniz.

param (
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$type,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$MinecraftPath,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$StandardOutput
)
 
Set-Location $MinecraftPath
 
function Restart-Minecraft {
 
    Write-host "=============== Tanrı kimi oyun serveri başlayır ============"
 
    $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 "Başlama vaxtı:" $global:Process.StartTime
 
    Write-host "Çıxış kodu:" $global:Process.ExitCode
 
    Write-host "Çıxış vaxtı:" $global:Process.ExitTime
 
    Write-host "=============== Tanrı kimi oyun serveri dayandırıldı ============="
}
 
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

Register-Minecraft

Skript, demək olar ki, Start-Minecraft-ın təkrarıdır, yalnız yeni bir vəzifəni qeyd edir. Eyni arqumentləri qəbul edir. İstifadəçi adı göstərilməyibsə, hazırkı istifadəçini 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

Register-Autologon

Skriptdəki parametr blokunda Username və Password parametrləri qəbul edilir. Əgər Username göstərilməzsə, hazırkı istifadəçi adı istifadə olunur.

function Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage="Avtomatik daxil olma üçün istifadəçi adı")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="İstifadəçi şifrəsi")]
        [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 istifadəçi avtomatik girişini aktiv edəcək."
 
    }
    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 "Avtomatik giriş uğurla quruldu."
 
}

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

Set-Autologon -Password "PlaintextPassword"

Necə istifadə etməli

İndi müəllifin bu vasitələrdən necə istifadə etdiyini nəzərdən keçirəcəyik. Minecraft-ı Windows-da necə düzgün bir ictimai serverə çevirmək lazımdır. Hər şeyə əvvəldən başlayırıq.

1. İstifadəçi yaradırıq

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

2. Skripti işə salmaq üçün vəzifəni qeyd edirik

Bunu modul vasitəsilə qeyd edə 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ə edə bilərsiniz:

$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 daxil olma funksiyasını aktiv edirik və maşını yenidən başladırıq

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

Tamamlanma

Müəllif bu skripti öz ehtiyacları üçün yaratdı, buna görə də təkliflərinizi diqqətlə dinləyəcək. Müəllif ümid edir ki, bu kod, sizin üçün ən azı minimal dərəcədə faydalı olmuşdur və məqalə maraqlıdır.

Ideal Minecraft serverini başlatma skripti

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster