Skrip permulaan pelayan Minecraft yang ideal

Skrip permulaan pelayan Minecraft yang ideal

Pengarang sangat menyukai permainan ini, dan dia sendiri adalah pentadbir pelayan kecil "semata-mata untuk rakan-rakan." Seperti biasa di kalangan amatur, segala-galanya di pelayan diubah suai, dan ini memerlukan ketidakstabilan dan, akibatnya, ranap. Memandangkan pengarang Powershell lebih mengetahui daripada lokasi kedai di jalannya, dia memutuskan untuk membuat "Skrip Terbaik untuk Melancarkan Minecraft 2020" Skrip yang sama digunakan sebagai asas untuk templat dalam Pasaran Ruvds. Tetapi semua sumber sudah ada dalam artikel. Sekarang, mengikut urutan, bagaimana semuanya dilakukan.

Perintah yang kita perlukan

Pembalakan alternatif

Pada suatu hari, selepas memasang beberapa lagi mod, saya mendapati bahawa pelayan, nampaknya, ranap tanpa mengisytiharkan perang. Pelayan tidak menulis ralat dalam latest.log atau dalam debug, dan konsol, yang secara teori sepatutnya menulis ralat ini dan berhenti, telah ditutup.

Jika dia tidak mahu menulis, dia tidak perlu. Kami mempunyai Powershell dengan cmdlet Objek Tee, yang mengambil objek dan mengeluarkannya ke fail dan ke konsol pada masa yang sama.

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

Dengan cara ini, Powershell akan mengambil StandardOutput dan menulisnya ke fail. Jangan cuba guna Mula-Proseskerana ia akan mengembalikan System.ComponentModel.Component dan bukan StandardOutput, dan -RedirectStandardOutput akan menjadikannya mustahil untuk masuk ke dalam konsol, itulah yang kita mahu elakkan.

Lancarkan hujah

Selepas memasang pasangan mod yang sama, penulis menyedari bahawa pelayan juga tidak mempunyai RAM yang mencukupi. Dan ini memerlukan menukar hujah pelancaran. Daripada menukarnya setiap kali dalam start.bat, yang digunakan oleh semua orang, cuma gunakan skrip ini.

Memandangkan Tee-Object hanya membaca StandardOutput apabila executable dipanggil "Just Like This", anda perlu membuat skrip lain. Skrip ini akan dilancarkan oleh Minecraft sendiri. Mari kita mulakan dengan hujah.

Untuk menikmati kemalasan utama pada masa hadapan, skrip mesti mengumpulkan hujah pelancaran dengan cepat. Untuk melakukan ini, mari kita mulakan dengan mencari versi terkini menjalin.

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

Dengan menggunakan objek isihan, kami akan sentiasa mengambil objek dengan bilangan terbesar, tidak kira berapa banyak objek yang anda letakkan di sana. Kemalasan yang hakiki.

Sekarang anda perlu menetapkan memori kepada pelayan. Untuk melakukan ini, ambil jumlah memori sistem dan tulis jumlahnya dalam rentetan.

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

Mula semula automatik yang betul

Penulis telah melihat fail .bat daripada orang lain, tetapi mereka tidak mengambil kira sebab mengapa pelayan dihentikan. Ini menyusahkan, bagaimana jika anda hanya perlu menukar fail mod atau memadam sesuatu?
Sekarang mari kita mulakan semula yang betul. Penulis sebelum ini menemui skrip pelik yang memulakan semula pelayan tanpa mengira sebab pelayan ditutup. Kami akan menggunakan kod keluar. Java menggunakan 0 sebagai kejayaan, jadi kami akan menari dari sini.

Mula-mula, mari buat fungsi yang akan memulakan semula pelayan jika ia gagal.

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

Skrip akan kekal dalam gelung sehingga pelayan dimatikan secara normal daripada konsolnya sendiri menggunakan arahan /stop.

Jika kami memutuskan untuk mengautomasikan segala-galanya, maka adalah baik untuk mengumpul tarikh mula, tarikh siap, dan juga sebab untuk siap.

Untuk melakukan ini, kami menulis hasil Mula-Proses ke dalam pembolehubah. Dalam skrip ia kelihatan seperti ini:

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

Dan kemudian kami menulis hasilnya ke fail. Inilah yang dikembalikan kepada kami dalam pembolehubah:

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

Semua ini boleh ditambah pada fail menggunakan Add-Content. Setelah menyisirnya sedikit, kami mendapat skrip ini, dan mari kita panggil ia 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

Sekarang mari buat skrip yang melancarkan pengendali.

Permulaan yang betul

Penulis mahu menjalankan versi Minecraft yang berbeza dari mana-mana laluan dalam satu modul, dan juga boleh menyimpan log dalam folder tertentu.

Masalahnya ialah proses itu mesti dimulakan oleh pengguna yang log masuk ke sistem. Ini boleh dilakukan melalui desktop atau WinRm. Jika anda menjalankan pelayan sebagai pengguna sistem atau pun pentadbir, tetapi tidak log masuk, maka Server.jar tidak akan dapat membaca eula.txt dan mula.

Kami boleh mendayakan log masuk automatik dengan menambah tiga entri pada pendaftaran.

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

Ia tidak selamat. Log masuk dan kata laluan ditunjukkan di sini dalam teks biasa, jadi untuk memulakan pelayan anda perlu mencipta pengguna berasingan yang mempunyai akses pada peringkat pengguna, atau dalam kumpulan yang lebih sempit. Ia sama sekali tidak disyorkan untuk menggunakan pentadbir standard untuk ini.

Kami menyelesaikan autolog masuk. Kini anda perlu mendaftar tugas baharu untuk pelayan. Kami akan menjalankan arahan dari Powershell, jadi ia akan kelihatan seperti ini:

$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

Memasang modul

Sekarang mari kita masukkan semuanya ke dalam modul yang boleh digunakan kemudian. Semua kod untuk skrip siap sedia ada di sini, import dan gunakan.

Anda boleh menggunakan semua yang diterangkan di atas secara berasingan jika anda tidak mahu mengganggu modul.

Mula-Minecraft

Mula-mula, mari buat modul yang tidak akan melakukan apa-apa selain menjalankan skrip yang akan mendengar dan merekod keluaran standard.

Dalam blok parameter, dia bertanya dari folder mana untuk melancarkan Minecraft dan di mana untuk meletakkan log.

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

Dan anda perlu melancarkan Minecraft seperti ini:

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

Sekarang mari kita beralih kepada Handler yang sedia untuk digunakan.ps1

Untuk membolehkan skrip kami menerima parameter apabila dipanggil, kami juga perlu menentukan blok parameter. Sila ambil perhatian, ia menjalankan Oracle Java, jika anda menggunakan pengedaran yang berbeza, anda perlu menukar laluan ke fail boleh laku.

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

Daftar-Minecraft

Skrip boleh dikatakan sama seperti Start-Minecraft, kecuali ia hanya mendaftarkan tugas baharu. Menerima hujah yang sama. Nama pengguna, jika tidak dinyatakan, mengambil nama semasa.

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

Daftar-Autologon

Dalam blok parameter, skrip menerima parameter Nama Pengguna dan Kata Laluan. Jika Nama Pengguna tidak dinyatakan, nama pengguna semasa digunakan.

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

Menjalankan skrip ini kelihatan seperti ini:

Set-Autologon -Password "PlaintextPassword"

Bagaimana nak guna

Sekarang mari kita lihat bagaimana penulis sendiri menggunakan semua ini. Cara menggunakan pelayan Minecraft awam dengan betul pada Windows. Mari kita mulakan dari awal lagi.

1. Buat pengguna

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

2. Daftar tugas untuk menjalankan skrip

Anda boleh mendaftar menggunakan modul seperti ini:

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

Atau gunakan alat standard:

$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. Dayakan autolog masuk dan but semula mesin

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

Siap

Penulis membuat skrip, termasuk untuk dirinya sendiri, oleh itu, dia akan gembira mendengar cadangan anda untuk menambah baik skrip. Penulis berharap semua kod ini sekurang-kurangnya berguna kepada anda, dan artikel itu menarik.

Skrip permulaan pelayan Minecraft yang ideal

Sumber: www.habr.com

Tambah komen