Skrip startup server Minecraft yang ideal

Skrip startup server Minecraft yang ideal

Penulis sangat menyukai permainan ini, dan dia sendiri adalah administrator dari server kecil “murni untuk teman.” Seperti biasa di kalangan amatir, semua yang ada di server dimodifikasi, dan ini menyebabkan ketidakstabilan dan, akibatnya, crash. Karena penulis Powershell lebih mengetahui lokasi toko di jalannya, dia memutuskan untuk membuat "Skrip Terbaik untuk Meluncurkan Minecraft 2020" Skrip yang sama menjadi dasar templat di Pasar Ruvds. Namun semua sumber sudah ada di artikel. Sekarang, secara berurutan, bagaimana semuanya dilakukan.

Perintah yang kita butuhkan

Penebangan alternatif

Suatu hari, setelah menginstal beberapa mod lagi, saya menemukan bahwa server tampaknya mogok tanpa menyatakan perang. Server tidak menulis kesalahan di log terbaru atau debug, dan konsol, yang secara teori seharusnya menulis kesalahan ini dan berhenti, ditutup.

Jika dia tidak ingin menulis, dia tidak perlu menulis. Kami memiliki Powershell dengan cmdlet Obyek Tee, yang mengambil objek dan mengeluarkannya ke file dan konsol secara bersamaan.

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

Dengan cara ini, Powershell akan mengambil StandardOutput dan menulisnya ke file. Jangan mencoba untuk menggunakan Mulai-Proseskarena itu akan mengembalikan System.ComponentModel.Component dan bukan StandardOutput, dan -RedirectStandardOutput akan membuat mustahil untuk masuk ke konsol, yang merupakan hal yang ingin kita hindari.

Luncurkan argumen

Setelah memasang mod yang sama, penulis memperhatikan bahwa server juga tidak memiliki cukup RAM. Dan ini memerlukan perubahan argumen peluncuran. Daripada mengubahnya setiap saat di start.bat, yang digunakan semua orang, gunakan saja skrip ini.

Karena Tee-Object hanya membaca StandardOutput ketika executable disebut "Just Like This", Anda harus membuat skrip lain. Skrip ini akan diluncurkan oleh Minecraft sendiri. Mari kita mulai dengan argumennya.

Untuk menikmati kemalasan di masa depan, naskah harus mengumpulkan argumen peluncuran dengan cepat. Untuk melakukan ini, mari kita mulai dengan mencari versi terbaru menempa.

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

Dengan menggunakan sort-object, kita akan selalu mengambil objek dengan jumlah terbesar, tidak peduli berapa banyak objek yang Anda letakkan di sana. Kemalasan yang luar biasa.

Sekarang Anda perlu menetapkan memori ke server. Untuk melakukan ini, ambil jumlah memori sistem dan tulis jumlahnya dalam string.

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

Mulai ulang otomatis yang benar

Penulis telah melihat file .bat dari orang lain, namun mereka tidak memperhitungkan alasan mengapa server dihentikan. Ini merepotkan, bagaimana jika Anda hanya perlu mengubah file mod atau menghapus sesuatu?
Sekarang mari kita lakukan restart yang benar. Penulis sebelumnya menemukan skrip aneh yang me-restart server terlepas dari alasan server dimatikan. Kami akan menggunakan kode keluar. Java menggunakan 0 sebagai sukses, jadi kita akan menari dari sini.

Pertama, mari buat fungsi yang akan me-restart server jika 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 tetap berada dalam loop sampai server mati secara normal dari konsolnya sendiri menggunakan perintah /stop.

Jika kami memutuskan untuk mengotomatiskan semuanya, maka alangkah baiknya jika kami mengumpulkan tanggal mulai, tanggal penyelesaian, dan juga alasan penyelesaian.

Untuk melakukan ini, kita menulis hasil Start-Process ke dalam sebuah variabel. Dalam skripnya terlihat 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 sebuah file. Inilah yang dikembalikan kepada kita dalam variabel:

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

Semua ini dapat ditambahkan ke file menggunakan Add-Content. Setelah menyisirnya sedikit, kita mendapatkan skrip ini, dan beri nama 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 kita buat skrip yang meluncurkan handler.

Startup yang benar

Penulis ingin menjalankan versi Minecraft yang berbeda dari jalur mana pun dalam satu modul, dan juga dapat menyimpan log di folder tertentu.

Masalahnya adalah proses tersebut harus dimulai oleh pengguna yang login ke sistem. Ini dapat dilakukan melalui desktop atau WinRm. Jika Anda menjalankan server sebagai pengguna sistem atau bahkan administrator, tetapi tidak masuk, Server.jar bahkan tidak akan dapat membaca eula.txt dan memulai.

Kita dapat mengaktifkan login otomatis dengan menambahkan tiga entri ke registri.

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

Itu tidak aman. Login dan kata sandi ditunjukkan di sini dalam teks biasa, jadi untuk memulai server Anda perlu membuat pengguna terpisah yang memiliki akses di tingkat pengguna, atau dalam grup yang lebih sempit. Sangat tidak disarankan menggunakan administrator standar untuk ini.

Kami memilah login otomatis. Sekarang Anda perlu mendaftarkan tugas baru untuk server. Kita akan menjalankan perintah dari Powershell, sehingga akan terlihat 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

Merakit modul

Sekarang mari kita masukkan semuanya ke dalam modul yang bisa digunakan nanti. Semua kode untuk skrip yang sudah jadi ada di sini, impor dan gunakan.

Anda dapat menggunakan semua yang dijelaskan di atas secara terpisah jika Anda tidak ingin repot dengan modul.

Mulai-Minecraft

Pertama, mari kita buat modul yang tidak melakukan apa pun selain menjalankan skrip yang akan mendengarkan dan mencatat keluaran standar.

Di blok parameter, dia menanyakan folder mana yang akan meluncurkan Minecraft dan di mana harus 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 harus meluncurkan Minecraft seperti ini:

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

Sekarang mari beralih ke Handler.ps1 yang siap digunakan

Agar skrip kita menerima parameter saat dipanggil, kita juga perlu menentukan blok parameter. Harap dicatat, ini menjalankan Oracle Java, jika Anda menggunakan distribusi yang berbeda, Anda perlu mengubah jalur ke file yang dapat dieksekusi.

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

Skripnya hampir sama dengan Start-Minecraft, hanya saja skrip ini hanya mendaftarkan tugas baru. Menerima argumen yang sama. Nama pengguna, jika tidak ditentukan, akan menggunakan nama pengguna saat ini.

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

Di blok parameter, skrip menerima parameter Nama Pengguna dan Kata Sandi. Jika Nama Pengguna tidak ditentukan, nama pengguna saat ini akan 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 terlihat seperti ini:

Set-Autologon -Password "PlaintextPassword"

Bagaimana cara menggunakan

Sekarang mari kita lihat bagaimana penulisnya sendiri menggunakan semua ini. Cara menyebarkan server Minecraft publik dengan benar di Windows. Mari kita mulai dari awal.

1. Buat pengguna

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

2. Daftarkan tugas untuk menjalankan skrip

Anda dapat mendaftar menggunakan modul seperti ini:

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

Atau gunakan alat standar:

$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. Aktifkan login otomatis dan reboot mesin

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

Penyelesaian

Penulis membuat skripsi ini termasuk untuk dirinya sendiri, oleh karena itu dengan senang hati ia akan mendengarkan saran-saran dari anda demi penyempurnaan skripsi ini. Penulis berharap semua kode ini setidaknya bermanfaat bagi Anda, dan artikelnya menarik.

Skrip startup server Minecraft yang ideal

Sumber: www.habr.com

Tambah komentar