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

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

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

الأوامر التي نحتاجها

التسجيل البديل

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

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

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

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

إطلاق الحجج

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

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

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

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

باستخدام Sort-object ، سنأخذ دائمًا الكائن الذي يحتوي على أكبر رقم ، بغض النظر عن العدد الذي تضعه هناك. الكسل المطلق.

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

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

إعادة التشغيل التلقائي السليم

رأى المؤلف ملفات .bat من أشخاص آخرين ، لكنهم لم يأخذوا في الحسبان سبب إيقاف الخادم. إنه أمر غير مريح ، ماذا لو كنت بحاجة فقط إلى تغيير ملف mod أو حذف شيء ما؟
الآن دعنا نقوم بإعادة التشغيل المناسبة. صادف المؤلف سابقًا نصوصًا برمجية غريبة أعادت تشغيل الخادم بغض النظر عن سبب خروج الخادم. سوف نستخدم كود الخروج. تستخدم 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 filesOracleJavajavapath_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 والبدء.

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

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

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

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

$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

تجميع الوحدة

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

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

بدء تشغيل ماين كرافت

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

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

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:minecraftstdout.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 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

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

البرنامج النصي عمليًا هو نفسه 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

تسجيل- Autologon

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

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

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

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:minecraftstdout.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:minecraftstdout.txt" -MinecraftPath "C:minecraft"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

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

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

إتمام

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

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

المصدر: www.habr.com

إضافة تعليق