مثالی مائن کرافٹ سرور اسٹارٹ اپ اسکرپٹ

مثالی مائن کرافٹ سرور اسٹارٹ اپ اسکرپٹ

مصنف کو اس کھیل سے بہت پیار ہے، اور وہ خود ایک چھوٹے سرور کے منتظم ہیں "خالص طور پر دوستوں کے لیے۔" جیسا کہ شوقیہ لوگوں میں معمول ہے، سرور پر موجود ہر چیز کو موڈ کیا جاتا ہے، اور اس میں عدم استحکام آتا ہے اور اس کے نتیجے میں کریش ہو جاتا ہے۔ چونکہ پاورشیل کا مصنف اپنی گلی میں موجود اسٹورز کے مقام سے بہتر جانتا ہے، اس لیے اس نے فیصلہ کیا کہ "مائن کرافٹ 2020 لانچ کرنے کے لیے بہترین اسکرپٹ" اسی اسکرپٹ نے ٹیمپلیٹ کی بنیاد کے طور پر کام کیا۔ Ruvds بازار. لیکن تمام ذرائع پہلے ہی مضمون میں موجود ہیں۔ اب، ترتیب میں، یہ سب کیسے کیا گیا تھا.

ہمیں جن احکامات کی ضرورت ہے۔

متبادل لاگنگ

ایک دن، کچھ اور موڈز انسٹال کرنے کے بعد، میں نے دریافت کیا کہ سرور، بظاہر، اعلان جنگ کیے بغیر کریش ہو رہا تھا۔ سرور نے latest.log یا ڈیبگ میں غلطیاں نہیں لکھیں، اور کنسول، جسے نظریہ طور پر یہ ایرر لکھنا چاہیے تھا اور بند ہونا چاہیے تھا، بند کر دیا گیا تھا۔

اگر وہ لکھنا نہیں چاہتا تو اسے اس کی ضرورت نہیں ہے۔ ہمارے پاس cmdlet کے ساتھ پاورشیل ہے۔ ٹی آبجیکٹ، جو کسی چیز کو لیتا ہے اور اسے ایک ہی وقت میں فائل اور کنسول میں آؤٹ پٹ کرتا ہے۔

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

اس طرح پاورشیل اسٹینڈرڈ آؤٹ پٹ کو اٹھائے گا اور اسے فائل میں لکھے گا۔ استعمال کرنے کی کوشش نہ کریں۔ شروع عملکیونکہ یہ StandardOutput کے بجائے System.ComponentModel.Component واپس کر دے گا، اور -RedirectStandardOutput کنسول میں داخل ہونا ناممکن بنا دے گا، جس سے ہم بچنا چاہتے ہیں۔

دلائل شروع کریں۔

موڈز کے اسی جوڑے کو انسٹال کرنے کے بعد، مصنف نے دیکھا کہ سرور کے پاس بھی کافی RAM نہیں ہے۔ اور اس کے لیے لانچ کے دلائل کو تبدیل کرنے کی ضرورت ہے۔ انہیں start.bat میں ہر بار تبدیل کرنے کے بجائے، جسے ہر کوئی استعمال کرتا ہے، بس اس اسکرپٹ کا استعمال کریں۔

چونکہ Tee-Object صرف StandardOutput کو پڑھتا ہے جب executable کو "Just Like This" کہا جاتا ہے، آپ کو ایک اور اسکرپٹ بنانا پڑے گا۔ یہ اسکرپٹ مائن کرافٹ خود لانچ کرے گا۔ آئیے دلائل سے شروع کرتے ہیں۔

مستقبل میں حتمی سستی میں ملوث ہونے کے لیے، اسکرپٹ کو فلائی پر لانچ کے دلائل جمع کرنے چاہئیں۔ ایسا کرنے کے لیے، آئیے تازہ ترین ورژن تلاش کرکے شروع کریں۔ قائم.

$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 فائلیں دیکھی ہیں، لیکن انہوں نے سرور کے بند ہونے کی وجہ کو مدنظر نہیں رکھا۔ یہ تکلیف دہ ہے، اگر آپ کو صرف موڈ فائل کو تبدیل کرنے یا کچھ حذف کرنے کی ضرورت ہو تو کیا ہوگا؟
اب ایک مناسب ری اسٹارٹ کرتے ہیں۔ مصنف نے پہلے عجیب و غریب اسکرپٹس کا سامنا کیا تھا جس نے سرور کو دوبارہ شروع کیا اس سے قطع نظر کہ سرور کیوں بند ہوا ہے۔ ہم ایگزٹ کوڈ استعمال کریں گے۔ جاوا 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 کمانڈ کا استعمال کرکے بند نہ ہوجائے۔

اگر ہم ہر چیز کو خودکار کرنے کا فیصلہ کرتے ہیں، تو اچھا ہو گا کہ شروع ہونے کی تاریخ، تکمیل کی تاریخ، اور تکمیل کی وجہ بھی جمع کر لیں۔

ایسا کرنے کے لیے، ہم Start-Process کا نتیجہ متغیر میں لکھتے ہیں۔ اسکرپٹ میں یہ اس طرح لگتا ہے:

$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

یہ سب شامل مواد کا استعمال کرتے ہوئے فائل میں شامل کیا جا سکتا ہے۔ اسے تھوڑا سا کنگھی کرنے کے بعد، ہمیں یہ اسکرپٹ مل گیا، اور آئیے اسے 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: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

یہ محفوظ نہیں ہے۔ لاگ ان اور پاس ورڈ یہاں سادہ متن میں اشارہ کیا گیا ہے، لہذا سرور کو شروع کرنے کے لیے آپ کو ایک علیحدہ صارف بنانا ہوگا جس کی رسائی صارف کی سطح پر ہو، یا اس سے بھی زیادہ تنگ گروپ میں ہو۔ اس کے لیے معیاری منتظم استعمال کرنے کی سختی سے سفارش نہیں کی جاتی ہے۔

ہم نے خودکار لاگ ان کو ترتیب دیا۔ اب آپ کو سرور کے لیے ایک نیا کام رجسٹر کرنے کی ضرورت ہے۔ ہم پاورشیل سے کمانڈ چلائیں گے، تو یہ اس طرح نظر آئے گا:

$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 کی طرف چلتے ہیں۔

ہماری اسکرپٹ کو کال کرنے پر پیرامیٹرز کو قبول کرنے کے لیے، ہمیں ایک پیرامیٹر بلاک بھی بتانا ہوگا۔ براہ کرم نوٹ کریں، یہ اوریکل جاوا چلاتا ہے، اگر آپ مختلف ڈسٹری بیوشن استعمال کر رہے ہیں تو آپ کو قابل عمل فائل کا راستہ تبدیل کرنے کی ضرورت ہوگی۔

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

رجسٹر - آٹولوگون

پیرامیٹرز بلاک میں، اسکرپٹ صارف نام اور پاس ورڈ کے پیرامیٹرز کو قبول کرتا ہے۔ اگر صارف نام کی وضاحت نہیں کی گئی تھی، تو موجودہ صارف کا نام استعمال کیا جاتا ہے۔

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"

استعمال کرنے کا طریقہ

اب دیکھتے ہیں کہ مصنف خود اس سب کو کس طرح استعمال کرتا ہے۔ ونڈوز پر پبلک مائن کرافٹ سرور کو صحیح طریقے سے کیسے تعینات کیا جائے۔ آئیے شروع سے شروع کرتے ہیں۔

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"

تکمیل

مصنف نے اسکرپٹ کو اپنے لیے بھی بنایا ہے، اس لیے اسے اسکرپٹ کو بہتر بنانے کے لیے آپ کی تجاویز سن کر خوشی ہوگی۔ مصنف کو امید ہے کہ یہ تمام کوڈ کم از کم آپ کے لیے مفید تھا، اور یہ کہ مضمون دلچسپ تھا۔

مثالی مائن کرافٹ سرور اسٹارٹ اپ اسکرپٹ

ماخذ: www.habr.com

نیا تبصرہ شامل کریں