A szerző nagyon szereti a játékot, és ő maga is egy kis szerver adminisztrátora, amit "csak barátoknak" üzemeltet. Ahogy az a játékosok körében szokás, a szerveren mindent megmodoltak, ami instabil működést és ebből kifolyólag leállásokat von maga után. Mivel a Powershellt jobban ismeri, mint a boltjai elhelyezkedését az utcájában, úgy döntött, hogy készít egy "A Legjobb Script Minecraft Futtatására 2020". Ez a script szolgált alapként a Ruvds piacon található sablonhoz. A szükséges parancsaink
Alternatív naplózás
Egyszer, amikor még pár modot feltelepítettem, észrevettem, hogy a szerver, úgy tűnik, háborús bejelentés nélkül omlik össze. A szerver nem írt hibákat a latest.log-ba vagy a debugba, és a konzol, amelynek elvileg ezt a hibát kellett volna kiírnia és megállnia, le volt zárva.
Ha nem akar írni – nem is kell. Van nekünk Powershellünk a
Tee-Object parancsletével, amely az objektumot egyszerre kiírja egy fájlba és a konzolra..handler.ps1 | Tee-Object .StandardOutput.txt -Append
Így a Powershell be fogja olvasni a StandardOutput-ot és le fogja írni egy fájlba. Ne próbálkozz aStart-Process -szal, mert az System.ComponentModel.Component-t fog visszaadni, nem pedig StandardOutput-ot, és a -RedirectStandardOutput megakadályozza a bemenetet a konzolba, amit el akarunk kerülni.A futtatási argumentumok
Miután feltelepítetted azt a pár modot, a szerző azt is észrevette, hogy a szerveren nincs elég RAM. Ezt meg kell változtatni a futtatási argumentumokban. Ahelyett, hogy minden alkalommal megváltoztatnád azokat a start.bat-ban, amit mindenki használ, egyszerűen használd ezt a scriptet.
Mivel a Tee-Object csak akkor olvassa a StandardOutput-ot, amikor a futtatható fájl "Közvetlenül így" van meghívva, egy újabb scriptet kell készíteni. Ez a script fogja indítani a Minecraftot. Kezdjük az argumentumokkal.
Ahhoz, hogy a jövőben a végső lustaságot élvezhessük, a scriptnek menet közben kell összegyűjtenie a futtatási argumentumokat. Ehhez kezdjük a legújabb verzió keresésével.
forge $forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1.
A sort-object segítségével mindig a legnagyobb számú objektumot fogjuk választani, bármennyi is legyen benne. A végső lustaság.Most a szerver memóriáját kell beállítani. Ehhez vegyük a rendszer memória mennyiségét, és írjuk össze a megfelelő összeget string formában.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum / 1gb) $xmx = "-Xms" + $ram + "G"
A helyes automatikus újraindításA helyes automatikus újraindítás
A szerző másoktól látott .bat fájlokat, de azok nem vették figyelembe, hogy miért állt le a szerver. Kellemetlen, hogy ha csak a mod fájlt kellene kicserélni vagy törölni valamit?
Most helyesen újraindítjuk. A szerző korábban furcsa szkriptekbe ütközött, amelyek a szerver újraindítását végezték, függetlenül attól, hogy miért állt le a szerver. Mi a kilépési kódot fogjuk használni. A Java 0-át használ sikeres befejezésként, ezért erre fogunk alapozni.
Először is hozzunk létre egy funkciót, amely újraindítja a szervert, ha az nem sikeresen fejezi be a működését.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
A szkript ciklusban marad, amíg a szerver a saját konzolján nem fejez be normálisan, a \/stop paranccsal.
Ha mindent automatizálni akarunk, akkor érdemes lenne gyűjteni a kezdési, befejezési dátumot és az okot is, amiért befejeződött.
Ehhez rögzítjük a Start-Process eredményét egy változóba. A szkripten ez így néz ki:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThruAztán rögzítjük az eredményeket egy fájlba. Íme, mi kerül a változóba:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeMindezt az Add-Content segítségével hozzá lehet adni a fájlhoz. Egy kis simítással az alábbi szkriptet kapjuk, amit handler.ps1-nek hívunk.
Add-Content -Value "Kezdési idő:" -Path $Logfile
$global:Process.StartTime
Add-Content -Value "Kilépési kód:" -Path $Logfile
$global:Process.ExitCode | Add-Content $Logfile
Add-Content -Value "Kilépési idő:" -Path $Logfile
$global:Process.ExitTime | Add-Content $Logfile
Most formázzuk meg a szkriptet a handler indításához.
Helyes automatikus indítás
A szerző egyetlen modul segítségével szeretné elindítani a Minecraft különböző verzióit bármelyik útvonalról, és lehetőséget szeretne adni a naplók egy adott mappába való elhelyezésére.
A probléma az, hogy a folyamatot olyan felhasználónak kell indítania, aki be van jelentkezve a rendszerbe. Ezt megtehetjük az asztalon vagy a WinRm-en keresztül. Ha a szervert a rendszer vagy akár az adminisztrátor nevében indítjuk, de nem jelentkezünk be, akkor a Server.jar még az eula.txt-t sem tudja elolvasni, és nem tud elindulni.
Az automatikus bejelentkezést három bejegyzés hozzáadásával aktiválhatjuk a rendszerleíró adatbázisba.
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 SilentlyContinueEz nem biztonságos. A felhasználónév és jelszó itt sima szövegben van megadva, ezért külön felhasználót kell létrehozni a szerver futtatásához, amely csak felhasználói szintű hozzáféréssel rendelkezik, vagy egy még szűkebb csoportban. A standard adminisztrátor használatát kifejezetten nem ajánljuk.
Már foglalkoztunk az automatikus belépéssel. Most szükséges regisztrálni egy új feladatot a szerverhez. A parancsot PowerShellből fogjuk futtatni, tehát így fog kinézni:
$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Összegyűjtjük a modult
Most formába öntjük az egészet modulokba, amelyeket később fel lehet használni. Az összes kész script kód itt található, importáld és használd.
A fent leírtakat külön is használhatod, ha nem szeretnél modulokkal foglalkozni.
Start-Minecraft
Először létrehozunk egy modult, amely csak a script indítására fog szolgálni, amely hallgatni fog és naplózni fogja a standardoutputot.
A paraméterek blokkban megkérdezi, hogy melyik mappából szeretnéd futtatni a Minecraftot és hová kellene a naplót menteni.
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-MinecraftA Minecraftot így kell indítani:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"Most térjünk át a kész Handler.ps1-re
Ahhoz, hogy a scriptünk paramétereket tudjon fogadni híváskor, szükséges a paraméterek blokk megadása is. Ne feledd, hogy az Oracle Java-t indítja el, ha másik disztribúciót használsz, módosítani kell a végrehajtható fájl elérési útját.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== A rendkívüli játékszerver indítása ============"
$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 "Kezdési idő:" $global:Process.StartTime
Write-host "Kilépési kód:" $global:Process.ExitCode
Write-host "Kilépési idő:" $global:Process.ExitTime
Write-host "=============== A rendkívüli játékszerver leállítva ============="
}
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
A script gyakorlatilag megismétli a Start-Minecraft-ot, azzal a különbséggel, hogy itt csak egy új feladatot regisztrál. Ugyanazokat az argumentumokat fogadja el. Ha a felhasználónév nem volt megadva, a jelenlegi felhasználó nevét veszi.
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
A paraméterek blokkjában a script a Felhasználónév és Jelszó paramétereket veszi fel. Ha a Felhasználónév nem volt megadva, a jelenlegi felhasználó nevét használja.
function Set-Autologon {
param (
[Parameter(
HelpMessage="Autologon felhasználónév")]
$Username = $env:USERNAME,
[Parameter(Mandatory=$true,
HelpMessage="Felhasználói jelszó")]
[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 "A Set-Autologon engedélyezi a felhasználói automatikus bejelentkezést."
}
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 "Az autologon sikeresen beállítva."
}
A skript futtatása így néz ki:
Set-Autologon -Password "PlaintextPassword"Használati útmutató
Most nézzük meg, hogyan használja mindezt az író. Hogy kell helyesen telepíteni a nyilvános Minecraft szervert Windows rendszeren. Kezdjük az elején.
1. Felhasználó létrehozása
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. A skriptfuttatási feladat regisztrálása
Regisztrálhatja a modullal így:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MinecraftServer" -TaskName "MinecraftStarter"Vagy használja a standard eszközöket:
$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. Engedélyezzük az automatikus bejelentkezést, majd újraindítjuk a gépet
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Befejezés
Az író a saját részére is készítette a skriptet, ezért szívesen várja a javaslataikat a skript fejlesztésére. Reméli, hogy ez a kód legalább minimálisan hasznos volt az önök számára, és hogy az írás érdekesnek bizonyult.
Forrás: habr.com
