البرنامج النصي المثالي لتشغيل خادم Minecraft



المؤلف مغرم للغاية باللعبة ، وهو نفسه مسؤول عن خادم صغير "محض للأصدقاء". كالعادة بين الهواة ، يتم تعديل كل شيء على الخادم ، وهذا يستتبع عدم استقرار العمل ونتيجة للسقوط. نظرًا لأن المؤلف يعرف Powershell أفضل من موقع المتاجر في شارعه ، فقد قرر تقديم " أفضل سيناريو لإطلاق لعبة Minecraft 2020 ". خدم نفس البرنامج النصي كأساس للقالب في سوق Ruvds . لكن جميع المصادر موجودة بالفعل في المقالة. الآن ، من أجل ، كيف حدث كل ذلك.

نحن بحاجة إلى فرق


تسجيل بديل


بعد أن قمت بوضع تعديلين آخرين ، وجدت أن الخادم يبدو أنه يتعطل دون إعلان الحرب. لم يكتب الخادم أخطاء في أحدث. مدونة أو تصحيح ، وتم إغلاق وحدة التحكم ، التي كان من المفترض أن تكتب هذا الخطأ وتوقفه.

لا تريد الكتابة - لا حاجة. لدينا Powershell مع cmdlet Tee-Object ، الذي يأخذ كائنًا ويعرضه في ملف وفي وحدة التحكم في نفس الوقت.

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

بهذه الطريقة ، سوف تلتقط Powershell StandardOutput وتكتبه في ملف. لا تحاول استخدام Start-Process ، لأنه سيعيد System.ComponentModel.Component ، وليس StandardOutput ، و -RedirectStandardOutput سيجعل من المستحيل الدخول إلى وحدة التحكم ، والتي نريد تجنبها.

بدء الحجج


بوضع نفس زوج التعديل ، لاحظ المؤلف أن الخادم يفتقر أيضًا إلى ذاكرة الوصول العشوائي. وهذا يحتاج إلى تغيير وسيطات بدء التشغيل. بدلاً من تغييرها في كل مرة في start.bat ، والتي يستخدمها الجميع ، فقط استخدم هذا البرنامج النصي.

نظرًا لأن Tee-Object لا يقرأ StandardOutput إلا عندما يُطلق على الملف القابل للتنفيذ "Right So" ، فسيتعين عليك إنشاء برنامج نصي آخر. سيتم تشغيل هذا البرنامج النصي ماين كرافت نفسها. لنبدأ بالحجج.

من أجل الانغماس في الكسل النهائي في المستقبل ، يجب على النص أن يجمع حجج البدء على الفور. للقيام بذلك ، ابدأ بالبحث عن أحدث إصدار من forge .

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

بمساعدة كائن الفرز ، سنأخذ دائمًا الكائن بأكبر رقم ، بغض النظر عن مقدار وضعهم هناك. الكسل النهائي.

الآن تحتاج إلى تعيين ذاكرة للخادم. للقيام بذلك ، خذ مقدار ذاكرة النظام واكتب حجمها في السلسلة.

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

إعادة التشغيل التلقائي الصحيح


رأى المؤلف ملفات .bat من أشخاص آخرين ، لكنهم لم يأخذوا في الاعتبار سبب إيقاف الخادم. هل من غير اللائق أن تحتاج فقط إلى تغيير ملف التعديل أو حذف شيء ما؟
الآن دعونا نقوم بإعادة التشغيل الصحيحة. لقد صادف المؤلف سابقًا نصوصًا غريبة غريبة أعادت تشغيل الخادم على الرغم من حقيقة أنه تم إيقاف تشغيل الخادم. سنستخدم رمز الخروج. تستخدم Java 0 كإكمال ناجح ، وبالتالي سنرقص.

أولاً ، قم بإنشاء وظيفة ستعيد تشغيل الخادم إذا فشل في الإكمال.

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

سيبقى البرنامج النصي في الحلقة حتى يتم إيقاف تشغيل الخادم من وحدة التحكم الخاصة به بشكل طبيعي باستخدام الأمر / stop.

إذا قررنا جميعًا الأتمتة ، فسيكون من الجيد جمع تاريخ الإطلاق ، والانتهاء ، بالإضافة إلى سبب الاكتمال.

للقيام بذلك ، نكتب نتيجة بدء العملية إلى متغير. في النص ، يبدو كما يلي:

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

ثم نكتب النتائج في ملف. إليك ما يعود لنا في المتغير:

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

يمكن إضافة كل هذا باستخدام Add-Content إلى الملف. بعد أن تمشط قليلاً ، نحصل على مثل هذا البرنامج النصي ، ونطلق عليه 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

الآن دعنا ننفذ البرنامج النصي مع تشغيل المعالج.

بدء التشغيل الصحيح


يريد المؤلف وحدة واحدة لتشغيل ماين كرافت من إصدارات مختلفة من أي مسارات ، ويكون قادرًا أيضًا على وضع السجلات في مجلد معين.

المشكلة هي أن العملية يجب أن تبدأ من قبل المستخدم الموجود على النظام. يمكن القيام بذلك من خلال سطح المكتب أو WinRm. إذا قمت بتشغيل الخادم نيابة عن النظام أو حتى المسؤول ، ولكنك لم تقم بتسجيل الدخول ، فلن يتمكن Server.jar حتى من قراءة eula.txt وبدء التشغيل.

يمكننا تمكين تسجيل الدخول التلقائي إلى النظام عن طريق إضافة ثلاثة إدخالات إلى التسجيل.

New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password  -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1 -ErrorAction SilentlyContinue

إنها ليست آمنة. يشار إلى تسجيل الدخول وكلمة المرور هنا في نص عادي ، لذلك تحتاج إلى بدء مستخدم فردي لديه حق الوصول على مستوى المستخدم ، أو في مجموعة أضيق ، لبدء الخادم. لا يُنصح بشدة باستخدام مسؤول قياسي لهذا الغرض.

مع فرز الإدخال التلقائي. تحتاج الآن إلى تسجيل مهمة جديدة تحت الخادم. سنقوم بتشغيل الأمر من Powershell ، لذلك ستبدو كما يلي:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

وضع الوحدة معًا


الآن دعنا نجعل كل شيء في وحدات يمكن استخدامها لاحقًا. جميع التعليمات البرمجية للنصوص الجاهزة هنا والاستيراد والاستخدام.

يمكنك استخدام كل ما هو موضح أعلاه بشكل منفصل إذا كنت لا تريد الإزعاج مع الوحدات.

ابدأ ماين كرافت


أولاً ، سننشئ وحدة لن تفعل ذلك إلا ، ونقوم بتشغيل برنامج نصي يستمع ويسجل الناتج القياسي.

في كتلة المعلمة ، يسأل من المجلد الذي يتم تشغيل ماين كرافت وأين يتم وضع السجل.

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

وستحتاج إلى تشغيل ماين كرافت مثل هذا:

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

الآن دعنا ننتقل إلى Handler.ps1 الجاهز للاستخدام

حتى يتمكن النص البرمجي من قبول المعلمات عند الاستدعاء ، نحتاج أيضًا إلى تحديد كتلة معلمة. يرجى ملاحظة أنه يبدأ Oracle Java ، إذا كنت تستخدم توزيعًا مختلفًا ، فستحتاج إلى تغيير المسار إلى الملف القابل للتنفيذ.

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 files\Oracle\Java\javapath_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

تسجيل ماين كرافت


يكرر البرنامج النصي عمليًا Start-Minecraft ، باستثناء أنه يسجل مهمة جديدة فقط. يقبل نفس الحجج. يأخذ اسم المستخدم ، إذا لم يكن محددًا ، الاسم الحالي.

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

تسجيل أوتولوجون


في كتلة المعلمة ، يقبل البرنامج النصي معلمة اسم المستخدم وكلمة المرور. إذا لم يتم تحديد اسم المستخدم ، فسيتم استخدام اسم المستخدم الحالي.

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:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
 
    if ($null -eq $i) {
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password 
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1
        Write-Verbose "Set-Autologon will enable user auto logon."
 
    }
    else {
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1
    }
 
    
    Write-Verbose "Autologon was set successfully."
 
}

يبدو تشغيل هذا البرنامج النصي كما يلي:

Set-Autologon -Password "PlaintextPassword"

كيف تستعمل


الآن سننظر في كيفية استخدام المؤلف نفسه لكل هذا. كيفية نشر خادم Minecraft العام على Windows. لنبدأ من البداية.

1. إنشاء مستخدم

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

2. سجل مهمة تشغيل البرنامج النصي ،

يمكنك التسجيل باستخدام الوحدة ، على النحو التالي:

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

أو استخدم الأدوات القياسية:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

3. قم بتشغيل تسجيل الدخول التلقائي إلى النظام وأعد تشغيل الجهاز

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

إكمال


قدم المؤلف النص ، بما في ذلك لنفسه ، لذلك ، سيكون سعيدًا لسماع اقتراحاتك لتحسين البرنامج النصي. يأمل المؤلف في أن يكون كل هذا الرمز مفيدًا لك على الأقل إلى الحد الأدنى ، والمقال مثير للاهتمام.


All Articles