Kịch bản khởi động máy chủ Minecraft hoàn hảo

Kịch bản khởi động máy chủ Minecraft hoàn hảo

Tác giả rất yêu thích trò chơi này và bản thân anh cũng là quản trị viên của một máy chủ nhỏ “hoàn toàn dành cho bạn bè”. Như thường lệ đối với những người nghiệp dư, mọi thứ trên máy chủ đều được sửa đổi và điều này dẫn đến sự mất ổn định và kết quả là gây ra sự cố. Vì tác giả của Powershell biết rõ hơn vị trí của các cửa hàng trên phố của mình nên ông quyết định thực hiện "Kịch bản hay nhất để khởi chạy Minecraft 2020" Tập lệnh tương tự được dùng làm cơ sở cho mẫu trong Chợ Ruvds. Nhưng tất cả các nguồn đã có trong bài viết. Bây giờ, theo thứ tự, mọi chuyện đã được thực hiện như thế nào.

Các lệnh chúng ta cần

Ghi nhật ký thay thế

Một ngày nọ, sau khi cài đặt thêm một vài mod, tôi phát hiện ra rằng máy chủ dường như đang gặp sự cố mà không tuyên bố chiến tranh. Máy chủ không ghi lỗi trong new.log hoặc trong debug, và bảng điều khiển, theo lý thuyết đáng lẽ phải viết lỗi này và dừng lại, đã bị đóng.

Nếu anh ấy không muốn viết, anh ấy không cần phải viết. Chúng tôi có Powershell với lệnh ghép ngắn Đối tượng Tee, lấy một đối tượng và xuất nó thành một tệp và ra bảng điều khiển cùng một lúc.

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

Bằng cách này, Powershell sẽ lấy StandardOutput và ghi nó vào một tệp. Đừng cố gắng sử dụng Bắt đầu quá trìnhbởi vì nó sẽ trả về System.ComponentModel.Component chứ không phải StandardOutput, và -RedirectStandardOutput sẽ khiến không thể truy cập vào bảng điều khiển, đây là điều chúng tôi muốn tránh.

Khởi chạy đối số

Sau khi cài đặt cặp mod đó, tác giả nhận thấy máy chủ cũng không có đủ RAM. Và điều này đòi hỏi phải thay đổi các đối số khởi chạy. Thay vì thay đổi chúng mỗi lần trong start.bat mà mọi người đều sử dụng, chỉ cần sử dụng tập lệnh này.

Vì Tee-Object chỉ đọc StandardOutput khi tệp thực thi có tên là "Just Like This", nên bạn sẽ phải tạo một tập lệnh khác. Kịch bản này sẽ được chính Minecraft đưa ra. Hãy bắt đầu với những lập luận.

Để tận hưởng sự lười biếng tột cùng trong tương lai, kịch bản phải thu thập các đối số khởi chạy một cách nhanh chóng. Để thực hiện việc này, hãy bắt đầu bằng cách tìm kiếm phiên bản mới nhất giả mạo.

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

Sử dụng đối tượng sắp xếp, chúng tôi sẽ luôn lấy đối tượng có số lượng lớn nhất, bất kể bạn đặt bao nhiêu đối tượng ở đó. Sự lười biếng tột độ.

Bây giờ bạn cần gán bộ nhớ cho máy chủ. Để thực hiện việc này, hãy lấy dung lượng bộ nhớ hệ thống và viết dung lượng của nó thành chuỗi.

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

Tự động khởi động lại đúng cách

Tác giả đã xem file .bat của người khác nhưng họ không tính đến nguyên nhân khiến máy chủ bị dừng. Điều này thật bất tiện, nếu bạn chỉ cần thay đổi file mod hoặc xóa cái gì đó thì sao?
Bây giờ chúng ta hãy khởi động lại đúng cách. Trước đây tác giả đã gặp các tập lệnh lạ khởi động lại máy chủ bất kể lý do máy chủ tắt. Chúng tôi sẽ sử dụng mã thoát. Java sử dụng 0 là thành công, vì vậy chúng ta sẽ bắt đầu từ đây.

Đầu tiên, hãy tạo một hàm sẽ khởi động lại máy chủ nếu nó bị lỗi.

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

Tập lệnh sẽ vẫn ở trong vòng lặp cho đến khi máy chủ tắt bình thường từ bảng điều khiển của chính nó bằng lệnh /stop.

Nếu chúng tôi quyết định tự động hóa mọi thứ thì sẽ rất tốt nếu thu thập ngày bắt đầu, ngày hoàn thành và lý do hoàn thành.

Để làm điều này, chúng tôi viết kết quả của Start-Process vào một biến. Trong kịch bản nó trông như thế này:

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

Và sau đó chúng tôi ghi kết quả vào một tập tin. Đây là những gì được trả về cho chúng ta trong biến:

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

Tất cả điều này có thể được thêm vào một tập tin bằng cách sử dụng Add-Content. Sau khi tìm hiểu kỹ một chút, chúng ta có được tập lệnh này và hãy gọi nó là 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

Bây giờ hãy tạo một tập lệnh khởi chạy trình xử lý.

Khởi động đúng

Tác giả muốn chạy các phiên bản Minecraft khác nhau từ bất kỳ đường dẫn nào trong một mô-đun và cũng có thể lưu trữ nhật ký trong một thư mục cụ thể.

Vấn đề là quá trình này phải được bắt đầu bởi người dùng đã đăng nhập vào hệ thống. Điều này có thể được thực hiện thông qua máy tính để bàn hoặc WinRm. Nếu bạn chạy máy chủ với tư cách là người dùng hệ thống hoặc thậm chí là quản trị viên nhưng không đăng nhập thì Server.jar thậm chí sẽ không thể đọc eula.txt và khởi động.

Chúng tôi có thể kích hoạt đăng nhập tự động bằng cách thêm ba mục vào sổ đăng ký.

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

Nó không an toàn. Thông tin đăng nhập và mật khẩu được chỉ định ở đây bằng văn bản thuần túy, vì vậy để khởi động máy chủ, bạn cần tạo một người dùng riêng có quyền truy cập ở cấp độ người dùng hoặc trong một nhóm thậm chí còn hẹp hơn. Tuyệt đối không nên sử dụng quản trị viên tiêu chuẩn cho việc này.

Chúng tôi đã sắp xếp việc đăng nhập tự động. Bây giờ bạn cần đăng ký một nhiệm vụ mới cho máy chủ. Chúng ta sẽ chạy lệnh từ Powershell nên nó sẽ trông như thế này:

$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

Lắp ráp mô-đun

Bây giờ hãy đặt mọi thứ vào các mô-đun để có thể sử dụng sau này. Tất cả mã cho các tập lệnh tạo sẵn đều có ở đây, hãy nhập và sử dụng.

Bạn có thể sử dụng riêng mọi thứ được mô tả ở trên nếu bạn không muốn bận tâm đến các mô-đun.

Bắt đầu-Minecraft

Trước tiên, hãy tạo một mô-đun không làm gì khác hơn là chạy một tập lệnh sẽ nghe và ghi lại kết quả đầu ra tiêu chuẩn.

Trong khối tham số, anh ta hỏi sẽ khởi chạy Minecraft từ thư mục nào và đặt nhật ký ở đâu.

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

Và bạn sẽ cần khởi chạy Minecraft như thế này:

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

Bây giờ chúng ta hãy chuyển sang Handler.ps1 sẵn sàng sử dụng

Để tập lệnh của chúng tôi chấp nhận các tham số khi được gọi, chúng tôi cũng cần chỉ định một khối tham số. Xin lưu ý, nó chạy Oracle Java, nếu bạn đang sử dụng bản phân phối khác, bạn sẽ cần thay đổi đường dẫn đến tệp thực thi.

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

Đăng ký-Minecraft

Kịch bản thực tế giống với Start-Minecraft, ngoại trừ việc nó chỉ đăng ký một nhiệm vụ mới. Chấp nhận các lập luận tương tự. Tên người dùng, nếu không được chỉ định, sẽ lấy tên hiện tại.

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

Đăng ký-Autologon

Trong khối tham số, tập lệnh chấp nhận tham số Tên người dùng và Mật khẩu. Nếu Tên người dùng không được chỉ định, tên người dùng hiện tại sẽ được sử dụng.

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

Chạy tập lệnh này trông như thế này:

Set-Autologon -Password "PlaintextPassword"

Cách sử dụng

Bây giờ chúng ta hãy xem chính tác giả sử dụng tất cả những điều này như thế nào. Cách triển khai đúng cách máy chủ Minecraft công cộng trên Windows. Hãy bắt đầu lại từ đầu.

1. Tạo người dùng

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

2. Đăng ký tác vụ chạy script

Bạn có thể đăng ký bằng mô-đun như thế này:

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

Hoặc sử dụng các công cụ tiêu chuẩ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. Kích hoạt tính năng tự động đăng nhập và khởi động lại máy

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

Hoàn thành

Tác giả viết kịch bản, kể cả cho chính mình, vì vậy, anh ấy sẽ rất vui khi lắng nghe những góp ý của bạn để hoàn thiện kịch bản hơn. Tác giả hy vọng rằng tất cả mã này ít nhất hữu ích ở mức tối thiểu đối với bạn và bài viết rất thú vị.

Kịch bản khởi động máy chủ Minecraft hoàn hảo

Nguồn: www.habr.com

Thêm một lời nhận xét