Ամբողջական Minecraft սերվերի մեկնարկային սցենարը

Ամբողջական Minecraft սերվերի մեկնարկային սցենարը

Автор սիրում է խաղը, և ինքն էլ փոքրիկ սերվերի ադմինիստրատոր է «միայն ընկերների համար»: Ինչպես տեղի է ունենում սիրահարների շրջանում, սերվերում ամեն ինչ մոդավորված է, ինչը հանգեցնում է աշխատանքի անկայունության և, հետևաբար, անկումների: Քանի որ Powershell-ը հեղինակն ավելի լավ է գիտի, քան իր փողոցում խանութների գտնվելու վայրը, նա որոշեց ստեղծել «Լավագույն սկրիպտը Minecraft-ի մեկնարկի համար 2020»: Այս նույն սկրիպտը հանդիսացել է հիմք նրա համար, Ruvds կամարքեթիում. Բայց բոլոր սկզբնաղբյուրները արդեն կան հոդվածում: Այժմ հերթով, ինչպես դա ամենը կատարվեց:

Մենք պետք ունեցող հրամանները

Ալտերնատիվ գրառում

Մի անգամ որոշ մոդեր տեղադրելով ինձ հաջողվեց գտնել, որ սերվերը, կարծես թե, անկում է ապրում առանց հաղորդելու նախազգուշացման: Սերվերը չէր գրում սխալներ latest.log կամ debug-ում, իսկ կոնսոլը, որը, ի théorie, պետք է գրեր այդ սխալը և կանգ առներ, փակ էր:

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

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

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

Մեկնարկի аргументները

Այն մոդերը տեղադրելուց հետո, հեղինակն նկատեց, որ սերվերին զուտ չի հերիքում օպերատիվ հիշողություն: Հետևաբար, պետք է փոխել մեկնարկի аргументները: Փոխանակ յուրաքանչյուր անգամ փոխել դրանք start.bat-ում, որը բոլորը օգտագործում են, պարզապես օգտագործեք այս սկրիպտը:

Քանի որ Tee-Object-ն ընթերցում է StandardOutput-ը միայն երբ կատարելի ֆայլը կոչվում է «մոտավորապես այնպես», անհրաժեշտ կլինի ստեղծել մեկ այլ սկրիպտ: Ասված սկրիպտը կգործարկի ինքն իրեն Minecraft-ը: Թողնենք մեկնարկից:

Որպեսզի ապագայում համարձակորեն թուլանանք, սկրիպտը պետք է հավաքի մեկնարկի аргументները հոսքով: Դրա համար սկսենք որոնելով վերջին տարբերակը forge.

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

sort-object-ի օգնությամբ մենք միշտ վերցնում ենք այն օբյեկտը, որն ունի ամենաբարձր թիվը, ինչքան էլ դու այն գցես: Ուլտրա թուլություն:

Այժմ պետք է վերագրանցել սերվերի հիշողությունն: Դրա համար վերցնում ենք համակարգի հիշողության քանակը և գրանցում նրա գումարը string-ում:

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

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

Հեղինակն видел .bat ֆայլեր այլ մարդկանցից, բայց դրանք չէին հաշվի առնում, թե ինչու սերվերը կանգնել է: Դա անհարմար է, եթե պարզապես անհրաժեշտ է փոխել մոդի ֆայլը կամ ինչ-որ բան ջնջել:
Այժմ կատարենք ճիշտ վերագործարկում: Հեղինակն անցյալում հանդիպել էր տարօրինակ սկրիպտների, որոնք վերագործարկում էին սերվերը, չնայած թե ինչու սերվերը ավարտվեց: Մենք օգտագործելու ենք exitcode-ը: 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

Առաջին հերթին կասենք մոդուլ, որը միայն կգործի սկրիպտի, որը կհետևի և կգրանցի standardoutput:

Պարամետրերի բլոկում հարցնում է, թե ինչ ֆոլդերից պետք է գործարկվի 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 "=============== Ամենաշատ խաղային սերվեր ============"
 
    $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 "Սկիզբի ժամանակ:" $global:Process.StartTime
 
    Write-host "Գնացքի կոդ:" $global:Process.ExitCode
    
    Write-host "Վերջի ժամանակ:" $global:Process.ExitTime
 
    Write-host "=============== Վերջացած ամենաշատ խաղային սերվեր ============="
}
 
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

Register-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

Register-Autologon

Սkript-ի պարամետրերի հատվածում հաստատվում է Username և Password պարամետրը։ Եթե Username նշված չէ, օգտագործվում է ընթացիկ օգտագործողի անվանումը։

function Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage=" autologon համար օգտագործողի անունը ")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="Օգտագործողի գաղտնաբառը")]
        [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-ն կօգնի ակտիվացնել օգտագործողի ավտո մուտքագրմանը։"
 
    }
    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-ը հաջողությամբ կարգավորվել է։"
 
}

Այս skript-ն գործարկվում է հետևյալ կերպ։

Set-Autologon -Password "PlaintextPassword"

Ինչպես օգտագործել

Հիմա քննարկենք, թե ինչպես է հեղինակը ինքն իրեն օգտագործում այս ամենը։ Ինչպես ճիշտ բացել հանրային Minecraft սերվերը Windows-ում։ Դ beginnenթել պետք է ամեն ինչից։

1. Ստեղծել օգտվող

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

2. գրանցել skript-ի գործարկման խնդրանքը

Կարող եք գրանցել այսպես՝

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"

Ավարտ

Հեղինակը գրել է skriptը, ինչպես նաև իր համար, ուստի նա մեծ ուրախությամբ լսում է ձեր առաջարկությունները skriptի բարելավման վերաբերյալ։ Հեղինակը հույս ունի, որ այս ամբողջ կոդը ձեզ համար գոնե քիչ օգտակար էր, և հոդվածը հետաքրքիր է։

Ամբողջական Minecraft սերվերի մեկնարկային սցենարը

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster