Autorius labai mėgsta žaidimą, o jis pats yra mažo serverio administratorius „tik draugams“. Kaip įprasta tarp mėgėjų, viskas serveryje yra modifikuojama, o tai sukelia nestabilumą ir dėl to strigimus. Kadangi „Powershell“ autorius žino geriau nei parduotuvių vietą savo gatvėje, jis nusprendė padaryti „Geriausias scenarijus paleisti „Minecraft 2020“.“ Tas pats scenarijus buvo šablono pagrindas
Mums reikalingos komandos
Alternatyvus registravimas
Vieną dieną, įdiegęs dar keletą modifikacijų, sužinojau, kad serveris, matyt, sugenda nepaskelbus karo. Serveris nerašė klaidų į latest.log ar in debug, o konsolė, kuri teoriškai turėjo parašyti šią klaidą ir sustoti, buvo uždaryta.
Jei jis nenori rašyti, jam to nereikia. Mes turime Powershell su cmdlet Tee-Object, kuris paima objektą ir vienu metu išveda jį į failą ir į konsolę.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Tokiu būdu „Powershell“ pasiims standartinę išvestį ir įrašys ją į failą. Nebandykite naudoti Pradėti-Procesasnes jis grąžins System.ComponentModel.Component, o ne StandardOutput, o -RedirectStandardOutput neleis patekti į konsolę, ko norime išvengti.
Pradėti argumentus
Įdiegęs tą pačią modifikacijų porą, autorius pastebėjo, kad serveris taip pat neturi pakankamai RAM. O tam reikia pakeisti paleidimo argumentus. Užuot kiekvieną kartą juos keisdami start.bat, kurį naudoja visi, tiesiog naudokite šį scenarijų.
Kadangi „Tee-Object“ skaito „StandardOutput“ tik tada, kai vykdomasis failas vadinamas „Just Like This“, turėsite sukurti kitą scenarijų. Šį scenarijų paleis pats „Minecraft“. Pradėkime nuo argumentų.
Kad ateityje galėtumėte pasinerti į didžiausią tinginystę, scenarijus turi rinkti paleidimo argumentus. Norėdami tai padaryti, pradėkime nuo naujausios versijos paieškos kalvė.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Naudodami rūšiavimo objektą, mes visada paimsime didžiausią skaičių turintį objektą, nesvarbu, kiek jų ten įdėsite. Galutinė tinginystė.
Dabar reikia priskirti atmintį serveriui. Norėdami tai padaryti, paimkite sistemos atminties kiekį ir įveskite jo kiekį eilutėje.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Teisingas automatinis paleidimas iš naujo
Autorius matė .bat failus iš kitų žmonių, tačiau jie neatsižvelgė į priežastį, kodėl serveris buvo sustabdytas. Tai nepatogu, o jei jums tiesiog reikia pakeisti mod failą arba ką nors ištrinti?
Dabar atlikime tinkamą paleidimą iš naujo. Autorius anksčiau susidūrė su keistais scenarijais, kurie iš naujo paleido serverį, nepaisant to, kodėl serveris išsijungė. Mes naudosime išėjimo kodą. „Java“ sėkmingai naudoja 0, todėl šoksime nuo čia.
Pirmiausia sukurkime funkciją, kuri iš naujo paleis serverį, jei nepavyks.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Scenarijus liks cikle, kol serveris normaliai išsijungs iš savo konsolės, naudodamas komandą /stop.
Jei nuspręstume viską automatizuoti, būtų malonu surinkti pradžios datą, užbaigimo datą ir užbaigimo priežastį.
Norėdami tai padaryti, paleidimo proceso rezultatą įrašome į kintamąjį. Scenarijuje jis atrodo taip:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
Tada rezultatus įrašome į failą. Štai kas mums grąžinama kintamuoju:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Visa tai galima pridėti prie failo naudojant Add-Content. Šiek tiek sušukę gauname šį scenarijų ir pavadinkime jį 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
Dabar sukurkime scenarijų, kuris paleidžia tvarkyklę.
Teisingas paleidimas
Autorius nori paleisti skirtingas Minecraft versijas iš bet kurio kelio viename modulyje, taip pat turėti galimybę laikyti žurnalus konkrečiame aplanke.
Problema ta, kad procesą turi pradėti vartotojas, kuris yra prisijungęs prie sistemos. Tai galima padaryti naudojant darbalaukį arba WinRm. Jei paleisite serverį kaip sistemos vartotojas ar net administratorius, bet neprisijungsite, tada Server.jar net negalės perskaityti eula.txt ir paleisti.
Automatinį prisijungimą galime įjungti įtraukę tris įrašus į registrą.
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
Tai nesaugu. Prisijungimo vardas ir slaptažodis čia nurodomi paprastu tekstu, todėl norint paleisti serverį reikia sukurti atskirą vartotoją, kuris turi prieigą vartotojo lygiu arba dar siauresnėje grupėje. Tam griežtai nerekomenduojama naudoti standartinio administratoriaus.
Sutvarkėme automatinį prisijungimą. Dabar reikia užregistruoti naują užduotį serveriui. Mes vykdysime komandą iš Powershell, todėl ji atrodys taip:
$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
Modulio surinkimas
Dabar viską sudėkime į modulius, kuriuos bus galima naudoti vėliau. Visas paruoštų scenarijų kodas yra čia, importuokite ir naudokite.
Galite naudoti viską, kas aprašyta aukščiau, atskirai, jei nenorite vargti su moduliais.
Pradėti - Minecraft
Pirmiausia sukurkime modulį, kuris nieko daugiau nedarys, tik paleis scenarijų, kuris klausys ir įrašys standartinę išvestį.
Parametrų bloke jis klausia, iš kurio aplanko paleisti „Minecraft“ ir kur dėti žurnalą.
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
Ir jums reikės paleisti „Minecraft“ taip:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
Dabar pereikime prie paruošto naudoti Handler.ps1
Kad mūsų scenarijus priimtų parametrus, kai jis iškviečiamas, taip pat turime nurodyti parametrų bloką. Atminkite, kad jame veikia „Oracle Java“, jei naudojate kitą platinimą, turėsite pakeisti vykdomojo failo kelią.
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
Registracija - Minecraft
Scenarijus praktiškai nesiskiria nuo „Start-Minecraft“, tik registruoja tik naują užduotį. Priima tuos pačius argumentus. Vartotojo vardas, jei nenurodytas, paima dabartinį.
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
Registracija-Autologon
Parametrų bloke scenarijus priima vartotojo vardo ir slaptažodžio parametrus. Jei vartotojo vardas nenurodytas, naudojamas dabartinio vartotojo vardas.
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."
}
Šio scenarijaus vykdymas atrodo taip:
Set-Autologon -Password "PlaintextPassword"
Kaip naudotis
Dabar pažiūrėkime, kaip visa tai naudoja pats autorius. Kaip tinkamai įdiegti viešąjį „Minecraft“ serverį sistemoje „Windows“. Pradėkime nuo pat pradžių.
1. Sukurkite vartotoją
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Užregistruokite užduotį, kad paleistumėte scenarijų
Registruotis galite naudodami tokį modulį:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
Arba naudokite standartinius įrankius:
$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. Įjunkite automatinį prisijungimą ir paleiskite įrenginį iš naujo
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
Užbaigimas
Scenarijų sukūrė autorius, taip pat ir sau, todėl mielai išklausys jūsų pasiūlymus, kaip patobulinti scenarijų. Autorius tikisi, kad visas šis kodas bent minimaliai jums buvo naudingas, o straipsnis buvo įdomus.
Šaltinis: www.habr.com