Autor armastab mĂ€ngu vĂ€ga ning on ise vĂ€ikese serveri administraator, mis on tehtud "puhtalt sĂ”pradele". Kuidas see tavaliselt mĂ€ngijate seas kĂ€ib, on serveris kĂ”ik moditud, mis toob kaasa töö ebastabiilsuse ja seetĂ”ttu ka krahhe. Kuna Powershelli tunneb autor paremini kui oma kodu tĂ€naval asuvaid poode, otsustas ta luua "Parim Skript Minecrafti KĂ€ivitamiseks 2020". See skript sai aluseks mallile, mis on . Kuid kĂ”ik lĂ€htekoodid on juba artiklis olemas. NĂŒĂŒd jĂ€rjestikku, kuidas see kĂ”ik toimus.
Meile vajalikud kÀsud
Alternatiivne logimine
Kord seadsin veel paar moodulit ja avastasin, et server, nagu tundub, kukub ilma hoiatamata. Server ei kirjutanud veateateid latest.log-i ega debug'i, ja konsool, mis peaks selle vea vÀlja kirjutama ja peatuma, oli suletud.
Ei taha kirjutada â pole vaja. Meil on Powershell koos cmdlet'iga Tee-Object, mis vĂ”tab objekti ja vĂ€ljundab selle faili ja konsooli samal ajal.
.handler.ps1 | Tee-Object .StandardOutput.txt -AppendNii saab Powershell StandardOutput'i kĂ€tte ja kirjutab selle faili. Ărge proovige kasutada Start-Process, sest kuna see tagastab System.ComponentModel.Component, mitte StandardOutput, ja -RedirectStandardOutput takistab konsooli sisestamist, mida me tahame vĂ€ltida.
KĂ€ivitamisargumendid
PÀrast vajaliku modifikatsioonipaari seadmist mÀrkas autor, et serveril puudub ka piisavalt RAM-i. SeetÔttu on vaja muuta kÀivitamisargumente. Selle asemel, et iga kord neid start.bat failis muuta, mida kÔik kasutavad, kasutage lihtsalt seda skripti.
Kuna Tee-Object loeb StandardOutputi ainult siis, kui tĂ€idetav fail kutsub "Just niimoodi", tuleb luua veel ĂŒks skript. See skript kĂ€ivitab Minecrafti. Alustame argumentidest.
Et tulevikus ĂŒhelgi juhul laiskusest loobuda, peab skript koguma kĂ€ivitamisargumendid jooksvalt. selleks alustame viimase versiooni otsimisega. forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1Sort-objectiga vĂ”tame alati objekti, millel on suurim number, olenemata sellest, kui palju te neid sinna panete. Ălim laiskus.
NĂŒĂŒd peab serverile mÀÀrama mĂ€lu. Selleks vĂ”tame sĂŒsteemi mĂ€lu suuruse ja salvestame selle summa stringina.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"Ăige automaatne taaskĂ€ivitamine
Autori nÀgemus .bat-faile teistelt inimestelt, kuid need ei arvestanud pÔhjusega, miks server peatati. See on ebamugav, kui on lihtsalt vaja modifaili vahetada vÔi midagi kustutada?
NĂŒĂŒd teeme Ă”ige taaskĂ€ivitamise. Autor on varem kokku puutunud kummaliste skriptidega, mis taaskĂ€ivitavad serveri sĂ”ltumata sellest, miks server töö lĂ”petas. Meie kasutame exitcode'i. Java kasutab 0-d eduka lĂ”petamise jaoks, sealt ka lĂ€hme.
Esiteks loome funktsiooni, mis taaskÀivitab serveri, kui see lÔpetab töö ebaÔiglaselt.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Skript jÀÀb tsĂŒklisse, kuni server lĂ”petab töö korralikult oma konsoolist kĂ€suga /stop.
Kui me otsustame kÔik automatiseerida, oleks hea koguda ka kÀivitamise ja lÔpetamise kuupÀev ning lÔpetamise pÔhjus.
Selleks salvestame Start-Process'i tulemuse muutujasse. Skripti nÀeb vÀlja selline:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThruEdasi salvestame tulemused faili. Siin on, mis tagastatakse meile muutujasse:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeKogu seda saame "Add-Content" abil faili lisada. Veidi kohendades saame sellise skripti, mille nimetame 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
NĂŒĂŒd kujundame skripti handler'i kĂ€ivitamiseks.
Ăige automaatne sisselogimine
Autor soovib ĂŒhe mooduli abil kĂ€ivitada erinevate versioonide Minecrafti igalt teelt ning samuti saada logisid paigutada konkreetsetesse kaustadesse.
Probleem seisneb selles, et protsessi peab kĂ€ivitama kasutaja, kes on sĂŒsteemis sisselogitud. Seda saab teha töölaua vĂ”i WinRm kaudu. Kui serverit kĂ€ivitada sĂŒsteemi vĂ”i isegi administraatori Ă”igustes, kuid mitte sisse logida, siis Server.jar ei saa isegi eula.txt faili lugeda ja kĂ€ivituda.
Automaatse sisselogimise aktiveerimiseks saame lisada kolm kirjet registrisse.
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 SilentlyContinueSee on ohtlik. Logi ja parool on siin esitatud tavalise tekstina, seetĂ”ttu tuleks serveri kĂ€ivitamiseks luua eraldi kasutaja, kellel on kasutaja tasemel juurdepÀÀs vĂ”i veel kitsam rĂŒhm. Standardse administraatori kasutamine on selleks kategooriliselt ebasoovitav.
Automaatse sisselogimisega oleme selgeks saanud. NĂŒĂŒd tuleb registreerida uus ĂŒlesanne serveri jaoks. KĂ€ivitame kĂ€su Powershellist, seega nĂ€eb see vĂ€lja nii:
$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 HighestKogumine moodul
NĂŒĂŒd paneme kĂ”ik mooduliteks, mida saab hiljem kasutada. KĂ”ik valmis skriptide kood on siin, impordige ja kasutage.
Ălaltoodut saate kasutada eraldi, kui te ei soovi moodulitega vaeva nĂ€ha.
Start-Minecraft
Esmalt teeme mooduli, mis ainult kÀivitab skripti, mis kuulab ja salvestab standardvÀljundi.
Parameetrite plokis kĂŒsib ta, millisest kaustast kĂ€ivitada Minecrafti ja kuhu logi salvestada.
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-MinecraftJa Minecrafti kÀivitamine peab toimuma nii:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"NĂŒĂŒd liigume valmis Handler.ps1 juurde
Kuna meie skript peab kutsumise ajal parametreid vastu vÔtma, tuleb ka parameetrite plokk mÀÀrata. Pange tÀhele, et see kÀivitab Oracle Java; kui kasutate muud jaotust, tuleb tÀitmisteed muuta.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== KÀivitamine jumalik mÀngu 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 "Algusaeg:" $global:Process.StartTime
Write-host "VĂ€ljumiskood:" $global:Process.ExitCode
Write-host "LÔpuaeg:" $global:Process.ExitTime
Write-host "=============== Jumalik mÀngu server peatatud ============="
}
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
Registreeri-Minecraft
Skript kordab peaaegu Start-Minecraft'i, vĂ€lja arvatud see, et see registreerib ainult uue ĂŒlesande. See vĂ”tab samu argumente. Kasutajanimi vĂ”etakse, kui seda ei ole mÀÀratud, praeguselt.
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
Skriptis on parameeterid Username ja Password. Kui Username ei ole mÀÀratud, kasutatakse praeguse kasutaja nime.
function Set-Autologon {
param (
[Parameter(
HelpMessage="Autologon'i kasutaja nimi")]
$Username = $env:USERNAME,
[Parameter(Mandatory=$true,
HelpMessage="Kasutaja parool")]
[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 aktiveerib kasutaja automaatse sisenemise."
}
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 on edukalt seadistatud."
}
Selle skripti kÀivitamine nÀeb vÀlja jÀrgmine:
Set-Autologon -Password "PlaintextPassword"Kuidas kasutada
NĂŒĂŒd vaatame, kuidas autor seda kĂ”ike kasutab. Kuidas Ă”igesti seadistada avalikku Minecraft serverit Windowsis. Alustame algusest.
1. Loome kasutaja
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. Registreerime skripti kĂ€ivitamise ĂŒlesande
Registreerimine on vÔimalik jÀrgmise mooduli abil:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"VÔi kasutada tavalisi meetodeid:
$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. LĂŒlitage sisse automaatne sisselogimine ja taaskĂ€ivitage masin
Set-Autologon -Username "MinecraftServer" -Password "Qw3"LÔpetamine
Autor koostas skripti ka enda jaoks ning seetÔttu ootab ta hea meelega teie ettepanekuid skripti parandamiseks. Autor loodab, et kogu see kood on teile vÀhemalt minimaalselt kasulik olnud ning artikkel huvitav.
Allikas: habr.com
