Minecraft սերվերի գործարկման իդեալական սցենար

Minecraft սերվերի գործարկման իդեալական սցենար

Հեղինակը շատ է սիրում խաղը, և նա ինքն է փոքր սերվերի ադմինիստրատորը «զուտ ընկերների համար»: Ինչպես սովորական է սիրողականների շրջանում, սերվերի վրա ամեն ինչ փոփոխված է, և դա հանգեցնում է անկայունության և, որպես հետևանք, խափանումների: Քանի որ Powershell-ի հեղինակն ավելի լավ գիտի, քան իր փողոցի խանութների գտնվելու վայրը, նա որոշեց կատարել «Minecraft 2020-ը գործարկելու լավագույն սցենարը« Նույն սցենարը հիմք է ծառայել կաղապարի համար Ruvds շուկա. Բայց բոլոր աղբյուրներն արդեն հոդվածում են։ Հիմա, ըստ հերթականության, ինչպես արվեց այդ ամենը։

Մեզ անհրաժեշտ հրամանները

Այլընտրանքային անտառահատումներ

Մի օր, ևս մի քանի ռեժիմ տեղադրելուց հետո, ես հայտնաբերեցի, որ սերվերը, ըստ երևույթին, խափանում է առանց պատերազմ հայտարարելու: Սերվերը չի գրել սխալներ last.log-ում կամ debug-ում, և կոնսոլը, որը տեսականորեն պետք է գրեր այս սխալը և դադարեցվեր, փակվեց:

Եթե ​​նա չի ուզում գրել, պետք չէ: Մենք ունենք Powershell cmdlet-ով Tee-Object, որը վերցնում է օբյեկտը և միաժամանակ դուրս բերում ֆայլ և կոնսոլ:

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

Այս կերպ Powershell-ը կվերցնի StandardOutput-ը և կգրի այն ֆայլում: Մի փորձեք օգտագործել Սկսել-Գործընթացքանի որ այն կվերադարձնի System.ComponentModel.Component-ը և ոչ թե StandardOutput-ը, իսկ -RedirectStandardOutput-ն անհնարին կդարձնի մուտքը վահանակ, ինչից մենք ուզում ենք խուսափել:

Գործարկել փաստարկները

Այդ նույն զույգ մոդերը տեղադրելուց հետո հեղինակը նկատեց, որ սերվերը նույնպես բավարար RAM չունի։ Եվ սա պահանջում է մեկնարկի փաստարկների փոփոխություն: Փոխանակ ամեն անգամ դրանք փոխելու start.bat-ում, որն օգտագործում են բոլորը, պարզապես օգտագործեք այս սցենարը:

Քանի որ Tee-Object-ը կարդում է StandardOutput միայն այն դեպքում, երբ գործարկվողը կոչվում է «Just Like This», դուք ստիպված կլինեք ստեղծել մեկ այլ սցենար: Այս սցենարը կգործարկվի հենց 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 ֆայլեր այլ մարդկանցից, սակայն նրանք հաշվի չեն առել սերվերի դադարեցման պատճառը։ Սա անհարմար է, իսկ եթե պարզապես անհրաժեշտ է փոխել 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 հրամանը:

Եթե ​​մենք որոշենք ավտոմատացնել ամեն ինչ, ապա լավ կլինի հավաքել մեկնարկի ամսաթիվը, ավարտի ամսաթիվը, ինչպես նաև ավարտի պատճառը:

Դա անելու համար մենք 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

Այս ամենը կարելի է ավելացնել ֆայլում՝ օգտագործելով 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

Հիմա եկեք ստեղծենք սկրիպտ, որը գործարկում է handler-ը:

Ճիշտ գործարկում

Հեղինակը ցանկանում է գործարկել 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

Դա անվտանգ չէ։ Մուտքն ու գաղտնաբառը այստեղ նշված են պարզ տեքստով, ուստի սերվերը սկսելու համար անհրաժեշտ է ստեղծել առանձին օգտվող, ով մուտք ունի օգտվողի մակարդակով կամ նույնիսկ ավելի նեղ խմբում: Դրա համար խստիվ խորհուրդ չի տրվում օգտագործել ստանդարտ ադմինիստրատոր:

Մենք դասավորեցինք ավտոմատ մուտքը: Այժմ դուք պետք է գրանցեք նոր առաջադրանք սերվերի համար: Մենք կգործարկենք հրամանը 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

Մոդուլի հավաքում

Այժմ եկեք ամեն ինչ դնենք մոդուլների մեջ, որոնք հետագայում կարող են օգտագործվել: Պատրաստի սկրիպտների ամբողջ կոդը այստեղ է, ներմուծեք և օգտագործեք։

Դուք կարող եք օգտագործել այն ամենը, ինչ վերը նկարագրված է առանձին, եթե չեք ցանկանում անհանգստանալ մոդուլների հետ:

Start-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-ին

Որպեսզի մեր սկրիպտը ընդունի պարամետրերը կանչելիս, մենք պետք է նաև նշենք պարամետրային բլոկ: Խնդրում ենք նկատի ունենալ, որ այն աշխատում է 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

Գրանցվել-Minecraft

Սցենարը գործնականում նույնն է, ինչ 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"

Ինչպես օգտվել

Հիմա տեսնենք, թե ինչպես է հեղինակն ինքը օգտագործում այս ամենը։ Ինչպես ճիշտ տեղակայել հանրային 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 սերվերի գործարկման իդեալական սցենար

Source: www.habr.com

Добавить комментарий