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
