Автор սիրում է խաղը, և ինքն էլ փոքրիկ սերվերի ադմինիստրատոր է «միայն ընկերների համար»: Ինչպես տեղի է ունենում սիրահարների շրջանում, սերվերում ամեն ինչ մոդավորված է, ինչը հանգեցնում է աշխատանքի անկայունության և, հետևաբար, անկումների: Քանի որ Powershell-ը հեղինակն ավելի լավ է գիտի, քան իր փողոցում խանութների գտնվելու վայրը, նա որոշեց ստեղծել «Լավագույն սկրիպտը Minecraft-ի մեկնարկի համար 2020»: Այս նույն սկրիպտը հանդիսացել է հիմք նրա համար, . Բայց բոլոր սկզբնաղբյուրները արդեն կան հոդվածում: Այժմ հերթով, ինչպես դա ամենը կատարվեց:
Մենք պետք ունեցող հրամանները
Ալտերնատիվ գրառում
Մի անգամ որոշ մոդեր տեղադրելով ինձ հաջողվեց գտնել, որ սերվերը, կարծես թե, անկում է ապրում առանց հաղորդելու նախազգուշացման: Սերվերը չէր գրում սխալներ 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 1sort-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-MinecraftRegister-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 -UserMayNotChangePassword2. գրանցել 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 Highest3. ակտիվացնել ավտո մուտքը և վերագնելու մեքենան
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Ավարտ
Հեղինակը գրել է skriptը, ինչպես նաև իր համար, ուստի նա մեծ ուրախությամբ լսում է ձեր առաջարկությունները skriptի բարելավման վերաբերյալ։ Հեղինակը հույս ունի, որ այս ամբողջ կոդը ձեզ համար գոնե քիչ օգտակար էր, և հոդվածը հետաքրքիր է։
Ընտանիք: habr.com
