Autor armastab mängu väga ja on ka väikese serveri administraator " ainult sõprade jaoks ". Nagu tavaliselt mängijate seas, on serveris kõik modifitseeritud, mis toob endaga kaasa töö ebastabiilsuse ja seetõttu ka kahanemise. Kuna Powershell on autorile tuttavam kui poodide asukoht oma tänaval, otsustas ta teha "Parim skript Minecrafti käivitamiseks 2020". See sama skript oli aluseks mallile . Kuid kõik algfailid on juba artiklis olemas. Nüüd järjestikku, kuidas seda kõike toodeti.
Meile vajalikud käsud
Alternatiivne logimine
Üks kord, kui ma paigaldasin veel paar modi, avastasin, et server kukub ilmselt ilma igasuguse hoiatuseeta. Server ei kirjutanud vigu latest.log faili ega debug-sse, ja konsol, mis pidi selle vea fikseerima ja peatuma, oli suletud.
Ei soovi kirjutada - pole probleem. Meil on Powershell koos cmdletiga Tee-Object, mis võtab objekti ja väljastab selle korraga faili ja konsole.
.handler.ps1 | Tee-Object .StandardOutput.txt -AppendSel viisil haarab Powershell StandardOutput’i ja kirjutab selle faili. Ärge proovige kasutada Start-Process, sest see tagastab System.ComponentModel.Component, mitte StandardOutput, ning -RedirectStandardOutput muudab konsooli sisestamise võimatuks, mida me soovime vältida.
Käivituse argumendid
Kui autor installis selle teise paari modi, märkas ta, et serverilt puudub ka sülearvuti mälu. Ja seda tuleb muuta käivituse argumentides. Selle asemel, et iga kord neid start.bat failis muuta, kasutage lihtsalt seda skripti.
Kuna Tee-Object loeb StandardOutput’i ainult siis, kui käivitatav fail kutsutakse "Nii nagu on", tuleb teha veel üks skript. See skript käivitab Minecrafti. Alustame argumentidega.
Kuna tulevikus peaksime olema äärmiselt laisad, peab skript koguma käivituse argumendid lennult. Selleks alustame viimasest versioonist forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1Kasutades sort-object'i, võtame alati objekti, millel on kõige suurem number, sõltumata sellest, kui palju te neid sinna asetate. Äärmiselt laisus.
Nüüd tuleb serverile mälu määrata. Selleks võtame süsteemimälu arvu 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
Autor nägi .bat faile teistelt, kuid need ei arvestanud põhjust, miks server oli peatatud. Kas see ei ole ebamugav, et kui on vaja lihtsalt modifaili vahetada või midagi kustutada?
Nüüd teeme õige taaskäivituse. Autor on varem kokku puutunud kummaliste skriptidega, mis taaskäivitasid serveri hoolimata sellest, miks server oli välja kukkunud. Me kasutame exitcode'i. Java kasutab 0 edukaks lõpetamiseks, sealt ka meie lähtumine.
Esmalt loome funktsiooni, mis taaskäivitab serveri, kui see lõpetab töötamise ebaõnnestunult.
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öö õigesti oma konsoolist käsuga /stop.
Kui me kõik automatiseerime, siis oleks hea ka käivitamise, lõpetamise ja lõpetamise põhjuse kuupäeva kogumine.
Selleks salvestame Start-Process'i tulemuse muutujasse. Skript näeb välja nii:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThruJa siis salvestame tulemused faili. Siin on, mis muutujasse tagastatakse:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeKõike seda saab Add-Content abil faili lisada. Veidi korraldades, saame sellise skripti, mida 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 laadimine
Autor soovib ühe mooduli abil käivitada Minecrafti erinevaid versioone igasugustest radadest ning võimalust koguda logisid kindlasse kausta.
Probleem seisneb selles, et protsessi peab käivitama kasutaja, kes on süsteemis sisse logitud. Seda saab teha töölauda või WinRm kaudu. Kui käivitada server süsteemi või isegi administraatori nime alt, kuid mitte sisse logida, ei suuda Server.jar isegi eula.txt lugeda ja käivituda.
Saame automaatse sisselogimise lubada, lisades registrisse kolm kirjet.
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 ei ole ohutu. Siin on sisselogimisdavad ja paroolid esitatud puhta tekstina, seetõttu tuleks serveri käivitamiseks luua eraldi kasutaja, kellel on juurdepääs kasutaja tasemel või veel kitsamas grupis. Tavalise administraatori kasutamine on seda kategooriliselt soovitatav.
Autostardi osas oleme nüüd selged. Nüüd peame registreerima uue ülesande 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 HighestKogume mooduli
Nüüd kirjeldame kogu asja moodulitena, mida hiljem kasutada. Siin on kogu valmis skripti kood, impordige ja kasutage.
Kogu eespool kirjeldatut saate kasutada eraldi, kui te ei soovi moodulitega vaeva näha.
Start-Minecraft
Alustame mooduli loomisega, mis lihtsalt käivitab skripti, mis kuulab ja salvestab standardväljundi.
Parameetrite plokis küsitakse, millisest kaustast käivitatakse Minecraft ja kuhu logi salvestatakse.
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 tuleb teha nii:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"Nüüd liigume kokku pandud Handler.ps1 juurde
Kuna meie skript peab käivitamisel võtma parameetreid, tuleb samuti määrata parameetrite plokk. Pange tähele, et see käivitab Oracle Java; kui kasutate muud distributsiooni, peate muutma teed täitmise faili.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== Käivitame jumalikku mänguserverit ============"
$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 "Lahkumiskood:" $global:Process.ExitCode
Write-host "Lõpetamise aeg:" $global:Process.ExitTime
Write-host "=============== Jumalik mänguserver peatus ============="
}
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
Skript kordab praktiliselt Start-Minecraft'i, välja arvatud see, et see registreerib ainult uue ülesande. See võtab samu argumendid. Kasutajanime puhul, kui see pole märgitud, võetakse kasutaja jooksva nime.
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
Skripti parameetrite plokis võtab skript argumendi Username ja Password. Kui Username ei ole määratud, kasutatakse jooksva kasutaja nime.
function Set-Autologon {
param (
[Parameter(
HelpMessage="Autologoni jaoks kasutatava kasutajanimi")]
$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 käyttäjän automaatloggen."
}
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 kogu seda kasutab. Kuidas korralikult üles seada Minecrafti avalik server Windowsis. Alustame algusest.
1. Loome kasutaja
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. Registreerime skripti käivitamise ülesande
Saate registreerida moduli abil nii:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MinecraftServer" -TaskName "MinecraftStarter"Või kasutada tavalisi vahendeid:
$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ülitame sisse automaatse sisselogimise ja taaskäivitame masina
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Kokkuvõte
Autor on skripti loonud ka iseendale, seetõttu on ta avatud teie ettepanekutele skripti täiustamiseks. Autor loodab, et kogu see kood on teile vähemalt minimaalselt kasulik olnud ja artikkel on huvitav.
Allikas: habr.com
