ఆదర్శవంతమైన Minecraft సర్వర్ స్టార్టప్ స్క్రిప్ట్

ఆదర్శవంతమైన Minecraft సర్వర్ స్టార్టప్ స్క్రిప్ట్

రచయిత ఆటను చాలా ప్రేమిస్తాడు మరియు అతను "పూర్తిగా స్నేహితుల కోసం" ఒక చిన్న సర్వర్ యొక్క నిర్వాహకుడు. ఔత్సాహికులలో సాధారణం వలె, సర్వర్‌లోని ప్రతిదీ సవరించబడింది మరియు ఇది అస్థిరతను కలిగిస్తుంది మరియు ఫలితంగా క్రాష్ అవుతుంది. పవర్‌షెల్ రచయితకు తన వీధిలోని దుకాణాల స్థానం కంటే బాగా తెలుసు కాబట్టి, అతను "Minecraft 2020ని ప్రారంభించడానికి ఉత్తమ స్క్రిప్ట్" లో టెంప్లేట్‌కి అదే స్క్రిప్ట్ ఆధారం Ruvds మార్కెట్. కానీ అన్ని మూలాలు ఇప్పటికే వ్యాసంలో ఉన్నాయి. ఇప్పుడు, క్రమంలో, ఇది ఎలా జరిగింది.

మనకు అవసరమైన ఆదేశాలు

ప్రత్యామ్నాయ లాగింగ్

ఒక రోజు, మరికొన్ని మోడ్‌లను ఇన్‌స్టాల్ చేసిన తర్వాత, సర్వర్ యుద్ధం ప్రకటించకుండానే క్రాష్ అవుతుందని నేను కనుగొన్నాను. సర్వర్ latest.log లేదా డీబగ్‌లో లోపాలను వ్రాయలేదు మరియు సిద్ధాంతపరంగా ఈ లోపాన్ని వ్రాసి ఆపివేయవలసిన కన్సోల్ మూసివేయబడింది.

అతను వ్రాయకూడదనుకుంటే, అతను అవసరం లేదు. మేము cmdletతో పవర్‌షెల్‌ని కలిగి ఉన్నాము టీ-ఆబ్జెక్ట్, ఇది ఒక వస్తువును తీసుకొని దానిని ఫైల్‌కి మరియు అదే సమయంలో కన్సోల్‌కు అవుట్‌పుట్ చేస్తుంది.

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

ఈ విధంగా, పవర్‌షెల్ స్టాండర్డ్ అవుట్‌పుట్‌ని ఎంచుకొని ఫైల్‌కి వ్రాస్తుంది. ఉపయోగించడానికి ప్రయత్నించవద్దు ప్రారంభం-ప్రక్రియఎందుకంటే ఇది System.ComponentModel.Componentని అందిస్తుంది మరియు స్టాండర్డ్ అవుట్‌పుట్ కాదు, మరియు -RedirectStandardOutput కన్సోల్‌లోకి ప్రవేశించడం అసాధ్యం చేస్తుంది, దీనిని మనం నివారించాలనుకుంటున్నాము.

వాదనలను ప్రారంభించండి

అదే జత మోడ్‌లను ఇన్‌స్టాల్ చేసిన తర్వాత, సర్వర్‌లో తగినంత RAM కూడా లేదని రచయిత గమనించారు. మరియు దీనికి ప్రయోగ వాదనలను మార్చడం అవసరం. ప్రతి ఒక్కరూ ఉపయోగించే start.batలో వాటిని ప్రతిసారీ మార్చే బదులు, ఈ స్క్రిప్ట్‌ని ఉపయోగించండి.

ఎక్జిక్యూటబుల్‌ని "జస్ట్ లైక్ దిస్" అని పిలిచినప్పుడు టీ-ఆబ్జెక్ట్ స్టాండర్డ్ అవుట్‌పుట్‌ను మాత్రమే చదువుతుంది కాబట్టి, మీరు మరొక స్క్రిప్ట్‌ని తయారు చేయాల్సి ఉంటుంది. ఈ స్క్రిప్ట్ Minecraft ద్వారానే ప్రారంభించబడుతుంది. వాదనలతో ప్రారంభిద్దాం.

భవిష్యత్తులో అంతిమ సోమరితనంలో మునిగిపోవడానికి, స్క్రిప్ట్ ఎగిరి ప్రయోగ వాదనలను సేకరించాలి. దీన్ని చేయడానికి, తాజా సంస్కరణ కోసం శోధించడం ద్వారా ప్రారంభిద్దాం నకలు.

$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 filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru

ఆపై మేము ఫలితాలను ఫైల్‌కు వ్రాస్తాము. ఇది వేరియబుల్‌లో మాకు తిరిగి ఇవ్వబడింది:

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

యాడ్-కంటెంట్ ఉపయోగించి ఇవన్నీ ఫైల్‌కి జోడించబడతాయి. కొద్దిగా దువ్విన తర్వాత, మేము ఈ స్క్రిప్ట్‌ని పొందుతాము మరియు దానిని హ్యాండ్లర్.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

ఇప్పుడు హ్యాండ్లర్‌ను ప్రారంభించే స్క్రిప్ట్‌ని క్రియేట్ చేద్దాం.

సరైన ప్రారంభం

రచయిత Minecraft యొక్క విభిన్న సంస్కరణలను ఒక మాడ్యూల్‌లో ఏదైనా మార్గం నుండి అమలు చేయాలనుకుంటున్నారు మరియు నిర్దిష్ట ఫోల్డర్‌లో లాగ్‌లను నిల్వ చేయగలరు.

సమస్య ఏమిటంటే, సిస్టమ్‌కు లాగిన్ అయిన వినియోగదారు ద్వారా ప్రక్రియ ప్రారంభించబడాలి. ఇది డెస్క్‌టాప్ లేదా 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

మాడ్యూల్ అసెంబ్లింగ్

ఇప్పుడు అన్నింటినీ తరువాత ఉపయోగించగల మాడ్యూల్స్‌లో ఉంచుదాం. రెడీమేడ్ స్క్రిప్ట్‌ల కోసం అన్ని కోడ్‌లు ఇక్కడ ఉన్నాయి, దిగుమతి చేయండి మరియు ఉపయోగించండి.

మీరు మాడ్యూల్స్‌తో ఇబ్బంది పడకూడదనుకుంటే పైన వివరించిన ప్రతిదాన్ని విడిగా ఉపయోగించవచ్చు.

స్టార్ట్-Minecraft

ముందుగా, స్టాండర్డ్ అవుట్‌పుట్‌ని వినడానికి మరియు రికార్డ్ చేసే స్క్రిప్ట్‌ను అమలు చేయడం కంటే మరేమీ చేయని మాడ్యూల్‌ని క్రియేట్ చేద్దాం.

పారామితుల బ్లాక్‌లో, అతను ఏ ఫోల్డర్ నుండి Minecraft ను ప్రారంభించాలో మరియు లాగ్‌ను ఎక్కడ ఉంచాలో అడుగుతాడు.

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

మరియు మీరు 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

నమోదు-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"

పూర్తి

రచయిత తనతో సహా స్క్రిప్ట్‌ను తయారుచేశాడు, కాబట్టి స్క్రిప్ట్‌ను మెరుగుపరచడానికి మీ సూచనలను వినడానికి అతను సంతోషిస్తాడు. ఈ కోడ్ అంతా మీకు కనీసం కనిష్టంగా ఉపయోగపడుతుందని మరియు వ్యాసం ఆసక్తికరంగా ఉందని రచయిత ఆశిస్తున్నారు.

ఆదర్శవంతమైన Minecraft సర్వర్ స్టార్టప్ స్క్రిప్ట్

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి