Autori e sheh shumë nga loja dhe është gjithashtu administrator i një serveri të vogël "çdo gjë për miqtë". Si zakonisht mes pasionantëve, në server është modifikuar gjithçka, dhe kjo sjell me vete paqëndrueshmëri të funksionimit dhe si pasojë rënie. Duke e njohur Powershell më mirë se sa vendndodhjen e dyqaneve në rrugën e tij, ai mori vendimin për të bërë "Skriptin më të Mirë për Të Nisur Minecraft 2020". Ky skript shërbeu gjithashtu si baza për një templates në . Të gjitha kodet burimore janë tashmë në artikull. Tani, hap pas hapi, se si është realizuar gjithçka.
Komandat që na nevojiten
Logimi alternativ
Një herë, duke vendosur edhe disa modifikacione, vura re se serveri, gjëja më e keqe, po ra pa asnjë paralajmërim. Serveri nuk shkruante gabime në latest.log ose në debug, ndërsa konsola, e cila teorikisht duhet ta shkruante këtë gabim dhe të ndalonte, ishte mbyllur.
Nëse nuk do të shkruajë, nuk është problem. Ne kemi Powershell me komandletin Tee-Object, i cili merr objektin dhe e nxjerr atë në një skedar dhe në konsolë në të njëjtën kohë.
.handler.ps1 | Tee-Object .StandardOutput.txt -AppendMe këtë, Powershell do të marrë StandardOutput dhe do ta regjistrojë atë në skedar. Mos u përpiqni të përdorni Start-Process, sepse ai do të kthejë System.ComponentModel.Component, dhe jo StandardOutput, ndërsa -RedirectStandardOutput do ta bëjë të pamundur hyrjen në konsolë, gjë që ne duam të shmangim.
Argumentet e nisjes
Duke vendosur atë çift modesh, autori vuri re se në server gjithashtu mungonte RAM-i. Pra, duhet të ndryshohen argumentet e nisjes. Në vend që të ndryshoni ato çdo herë në start.bat, të cilin të gjithë e përdorin thjesht përdorni këtë skripti.
Duke ditur se Tee-Object lexon StandardOutput, vetëm kur skedari ekzekutohet "ashtu si është", do të kemi nevojë për një skript tjetër. Ky skript do të nisë Minecraft vetë. Të fillojmë me argumentet.
Për të qenë në ardhmen lahen më lehtë, skripti duhet të mbledhë argumentet e nisjes në mënyrë dinamike. Prandaj, le të fillojmë duke kërkuar versionin më të fundit forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1Me përdorimin e sort-object ne gjithmonë do të marim objektin me numrin më të madh, sa herë që i vendosni atje. Ngarkesa e optimizuar.
Tani është koha të caktosh RAM-in për serverin. Për këtë, marrim sasinë e memories sistemike dhe regjistrojmë shumën e saj në string.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"Rivendosja automatike e duhur
Autori ka parë skedarë .bat nga njerëz të tjerë, por ata nuk merrnin parasysh arsyen pse serveri u ndal. A është e pakëndshme nëse thjesht duhet të ndryshoni skedarin e modit ose të fshini diçka?
Tani do të bëjmë një restart të saktë. Autorin e ka hasur më parë skenarë të çuditshëm që ribashkonin serverin pa marrë parasysh arsyen pse serveri ndalonte. Ne do të përdorim kodin e daljes. Java përdor 0 si përfundim të suksesshëm, kështu që aty do të fillojmë.
Së pari, do të krijojmë një funksion që do të ribashkojë serverin në rast se ai përfundon në mënyrë të pasuksesshme.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Skenari do të mbetet në cikël deri sa serveri të përfundojë normalisht nga consola e tij, me komandën /stop.
Nëse ne duam ta automatizojmë gjithçka, do të ishte mirë edhe të mbledhim datën e fillimit, përfundimit, si dhe arsyen e përfundimit.
Për këtë, ne regjistrojmë rezultatin Start-Process në një variabël. Në skenar kjo duket kështu:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThruDhe më pas, ne regjistrojmë rezultatet në një skedar. Ja çfarë kthehet në variablin tonë:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeTë gjitha këto nëpërmjet Add-Content mund të shtohen në një skedar. Pas pak rregullimi, e kemi këtë skenar, dhe do ta quajmë handler.ps1.
Add-Content -Value "Koha e fillimit:" -Path $Logfile
$global:Process.StartTime
Add-Content -Value "Kodi i daljes:" -Path $Logfile
$global:Process.ExitCode | Add-Content $Logfile
Add-Content -Value "Koha e daljes:" -Path $Logfile
$global:Process.ExitTime | Add-Content $Logfile
Tani le të organizojmë skenarin me lëshimin e handler-it.
Ribashkimi i saktë
Autori dëshiron të përdorë një modul për të nisur Minecraft me versione të ndryshme nga çdo rrugë dhe gjithashtu të ketë mundësinë të mbledhë logët në një dosje specifike.
Problemi është se procesi duhet të lansohet nga një përdorues që është në sistem. Kjo mund të bëhet përmes desktopit ose WinRm. Nëse nisni serverin nga emri i sistemit ose madje si administrator, por pa u identifikuar në sistem, Server.jar nuk do të mund të lexojë madje as eula.txt dhe të ndizet.
Ne mund ta aktivizojmë hyrjen automatike në sistem përmes shtimit të tri regjistrave në regjistrin.
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 SilentlyContinueKjo nuk është e sigurt. Login dhe fjalëkalimi jepen këtu në tekst të qartë, prandaj, për të filluar serverin duhet të krijoni një përdorues të veçantë, i cili ka akses në nivel përdoruesi ose në një grup më të ngushtë. Përdorimi i administratorit standard për këtë nuk rekomandohet për asnjë arsye.
Çështjen e autologimit e kemi zgjidhur. Tani duhet të regjistrojmë një detyrë të re për serverin. Do ta kemi ekzekutimin e komandës nga PowerShell, kështu që do të duket kështu:
$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 HighestPo e mbledhim modul
Tani le të organizojmë gjithçka në module, të cilat do të mund të përdoren më vonë. Të gjithë kodin e skenave të gatshme e keni këtu, importoni dhe përdorni.
Të gjitha që janë përshkruar më sipër mund t'i përdorni veçmas, nëse nuk dëshironi të angazhoheni me modulet.
Start-Minecraft
Fillimisht do të bëjmë një modul, i cili do të bëjë vetëm atë që do të fillojë një skenar, i cili do të dëgjojë dhe regjistrojë standardoutput.
Në bllokun e parametrave, e pyet se nga cilat dosje do të fillojë Minecraft dhe ku do të ruajë logun.
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-MinecraftDhe Minecraft do të nisë kështu:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"Tani do të kalojmë në Handler.ps1 të gatshëm për përdorim
Që skenari ynë të mund të pranojë parametra gjatë thirrjes, gjithashtu duhet të specifikohet blloku i parametrave. Vini re se ai nis Oracle Java; nëse përdorni një shpërndarje tjetër, do t'ju duhet të ndryshoni rrugën për skedarin ekzekutiv.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== Duke fill 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 duke fill 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
Regjistro-Minecraft
Skripti, në thelb, përsërit Start-Minecraft, përveç faktit se thjesht regjistron një detyrë të re. Ai pranon të njëjtat argumente. Emri i përdoruesit, nëse nuk është specified, merret nga përdoruesi aktual.
function Regjistro-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"
Regjistro-ScheduledTask -TaskName $TaskName -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
}
Export-ModuleMember -Function Regjistro-MinecraftRegjistro-Autologon
Në bllokun e parametrave, skripti pranon parametrin Username dhe Password. Nëse Username nuk është specified, përdoret emri i përdoruesit aktual.
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."
}
Kjo është mënyra si mund të ekzekutoni këtë skritp:
Set-Autologon -Password "PlaintextPassword"Si të përdoret
Tani le të shohim se si autori përdor këtë skritp. Si të konfiguroni në mënyrë të saktë një server publik Minecraft në Windows. Le ta fillojmë nga fillimi.
1. Krijoni një përdorues
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. Regjistroni një detyrë për të ekzekutuar skritpin
Mund ta regjistroni duke përdorur modulin si më poshtë:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"Ose mund të përdorni mjete standarde:
$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. Aktivizoni hyrjen automatike në sistem dhe rinisni kompjuterin
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Përfundimi
Autori e ka shkruar skritpin, për vetë nevojat e tij, prandaj, do të ishte i kënaqur të dëgjonte propozimet tuaja për përmirësimin e skritpit. Autori shpreson se i gjithë ky kod do t'ju jetë për të paktën minimalisht i dobishëm, dhe artikulli ishte interesant.
Burimi: habr.com
