Autoram ļoti patÄ«k spÄle, un viÅÅ” pats ir neliela servera administrators ātÄ«ri draugiemā. KÄ parasti amatieru vidÅ«, viss serverÄ« tiek modificÄts, un tas rada nestabilitÄti un rezultÄtÄ avÄrijas. TÄ kÄ Powershell autors zina labÄk nekÄ veikalu atraÅ”anÄs vietu savÄ ielÄ, viÅÅ” nolÄma izveidot "LabÄkais skripts Minecraft 2020 palaiÅ”anai" Tas pats skripts kalpoja par pamatu veidnei
Mums vajadzÄ«gÄs komandas
AlternatÄ«va mežizstrÄde
KÄdu dienu pÄc vÄl pÄris modifikÄciju instalÄÅ”anas es atklÄju, ka serveris, acÄ«mredzot, avarÄ, nepaziÅojot karu. Serveris neierakstÄ«ja kļūdas ne jaunÄkajÄ.logÄ, ne atkļūdoÅ”anÄ, un konsole, kurai teorÄtiski vajadzÄja ierakstÄ«t Å”o kļūdu un apturÄt, tika aizvÄrta.
Ja viÅÅ” nevÄlas rakstÄ«t, viÅam tas nav jÄdara. Mums ir Powershell ar cmdlet Tee-Object, kas Åem objektu un vienlaikus izvada to failÄ un konsole.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
TÄdÄ veidÄ Powershell paÅems standarta izvadi un ierakstÄ«s to failÄ. NemÄÄ£iniet lietot SÄkt-processjo tas atgriezÄ«s System.ComponentModel.Component, nevis StandardOutput, un -RedirectStandardOutput padarÄ«s neiespÄjamu iekļūŔanu konsolÄ, no kÄ mÄs vÄlamies izvairÄ«ties.
SÄciet argumentus
PÄc tÄ paÅ”a modifikÄcijas pÄra instalÄÅ”anas autors pamanÄ«ja, ka serverim arÄ« nav pietiekami daudz RAM. Un tas prasa mainÄ«t palaiÅ”anas argumentus. TÄ vietÄ, lai katru reizi tos mainÄ«tu start.bat, ko izmanto visi, vienkÄrÅ”i izmantojiet Å”o skriptu.
TÄ kÄ Tee-Object nolasa StandardOutput tikai tad, kad izpildÄmÄ faila nosaukums ir "Just Like This", jums bÅ«s jÄizveido cits skripts. Å o skriptu palaidÄ«s pats Minecraft. SÄksim ar argumentiem.
Lai turpmÄk ļautos galÄjam slinkumam, skriptam lidojumÄ ir jÄsavÄc palaiÅ”anas argumenti. Lai to izdarÄ«tu, sÄksim ar jaunÄkÄs versijas meklÄÅ”anu smÄde.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Izmantojot sort-object, mÄs vienmÄr paÅemsim objektu ar lielÄko skaitu neatkarÄ«gi no tÄ, cik daudz no tiem jÅ«s tur ievietojat. GalÄ«gais slinkums.
Tagad serverim ir jÄpieŔķir atmiÅa. Lai to izdarÄ«tu, paÅemiet sistÄmas atmiÅas apjomu un ierakstiet tÄ apjomu virknÄ.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Pareiza automÄtiskÄ restartÄÅ”ana
Autors ir redzÄjis .bat failus no citiem cilvÄkiem, taÄu viÅi nav ÅÄmuÅ”i vÄrÄ iemeslu, kÄpÄc serveris tika apturÄts. Tas ir neÄrti, ja jums vienkÄrÅ”i jÄmaina mod fails vai kaut kas jÄizdzÄÅ”?
Tagad veiksim pareizu restartÄÅ”anu. Autors iepriekÅ” saskÄrÄs ar dÄ«vainiem skriptiem, kas restartÄja serveri neatkarÄ«gi no tÄ, kÄpÄc serveris tika izslÄgts. MÄs izmantosim izejas kodu. Java izmanto 0 kÄ veiksmÄ«gu, tÄpÄc mÄs dejosim no Å”ejienes.
PirmkÄrt, izveidosim funkciju, kas restartÄs serveri, ja tas neizdosies.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Skripts paliks cilpÄ, lÄ«dz serveris parasti izslÄgsies no savas konsoles, izmantojot komandu /stop.
Ja mÄs nolemjam visu automatizÄt, tad bÅ«tu jauki savÄkt sÄkuma datumu, pabeigÅ”anas datumu un arÄ« pabeigÅ”anas iemeslu.
Lai to izdarÄ«tu, mÄs ierakstÄm Start-Process rezultÄtu mainÄ«gajÄ. SkriptÄ tas izskatÄs Å”Ädi:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
Un tad mÄs ierakstÄm rezultÄtus failÄ. Å is ir tas, kas mums tiek atgriezts mainÄ«gajÄ:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
To visu var pievienot failam, izmantojot Add-Content. Nedaudz to izÄ·emmÄjot, mÄs iegÅ«stam Å”o skriptu un sauksim to par 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
Tagad izveidosim skriptu, kas palaiž apdarinÄtÄju.
Pareiza palaiŔana
Autors vÄlas palaist dažÄdas Minecraft versijas no jebkura ceļa vienÄ modulÄ«, kÄ arÄ« var saglabÄt žurnÄlus noteiktÄ mapÄ.
ProblÄma ir tÄda, ka process ir jÄuzsÄk lietotÄjam, kurÅ” ir pieteicies sistÄmÄ. To var izdarÄ«t, izmantojot darbvirsmu vai WinRm. Ja palaižat serveri kÄ sistÄmas lietotÄjs vai pat administrators, bet nepiesakÄties, tad Server.jar pat nespÄs nolasÄ«t eula.txt un startÄt.
MÄs varam iespÄjot automÄtisko pieteikÅ”anos, pievienojot reÄ£istrÄ trÄ«s ierakstus.
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 SilentlyContinue
Tas nav droÅ”i. PieteikÅ”anÄs vÄrds un parole Å”eit ir norÄdÄ«ti vienkÄrÅ”Ä tekstÄ, tÄpÄc, lai palaistu serveri, ir jÄizveido atseviŔķs lietotÄjs, kuram ir piekļuve lietotÄja lÄ«menÄ« vai vÄl Å”aurÄkÄ grupÄ. Å im nolÅ«kam stingri nav ieteicams izmantot standarta administratoru.
MÄs nokÄrtojÄm automÄtisko pieteikÅ”anos. Tagad jums ir jÄreÄ£istrÄ jauns uzdevums serverim. MÄs izpildÄ«sim komandu no Powershell, tÄpÄc tÄ izskatÄ«sies Å”Ädi:
$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
Moduļa salikŔana
Tagad saliksim visu moduļos, kurus varÄs izmantot vÄlÄk. Viss gatavu skriptu kods ir Å”eit, importÄjiet un izmantojiet.
Varat izmantot visu iepriekÅ” aprakstÄ«to atseviŔķi, ja nevÄlaties uztraukties ar moduļiem.
Start-Minecraft
PirmkÄrt, izveidosim moduli, kas nedarÄ«s neko vairÄk, kÄ tikai palaidÄ«s skriptu, kas klausÄ«sies un ierakstÄ«s standarta izvadi.
Parametru blokÄ viÅÅ” jautÄ, no kuras mapes palaist Minecraft un kur ievietot žurnÄlu.
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-Minecraft
Un jums bÅ«s jÄpalaiž Minecraft Å”Ädi:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
Tagad pÄriesim uz lietoÅ”anai gatavu Handler.ps1
Lai mÅ«su skripts pieÅemtu parametrus, kad tas tiek izsaukts, mums ir jÄnorÄda arÄ« parametru bloks. LÅ«dzu, Åemiet vÄrÄ, ka tajÄ darbojas Oracle Java. Ja izmantojat citu izplatÄ«Å”anu, jums bÅ«s jÄmaina ceļŔ uz izpildÄmo failu.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== Starting godlike 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 godlike 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
ReÄ£istrÄties - Minecraft
Skripts ir praktiski tÄds pats kÄ Start-Minecraft, izÅemot to, ka tas reÄ£istrÄ tikai jaunu uzdevumu. PieÅem tos paÅ”us argumentus. LietotÄjvÄrds, ja tas nav norÄdÄ«ts, aizÅem paÅ”reizÄjo.
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-Minecraft
ReÄ£istrÄties-Autologon
Parametru blokÄ skripts pieÅem LietotÄjvÄrda un Paroles parametrus. Ja lietotÄjvÄrds nav norÄdÄ«ts, tiek izmantots paÅ”reizÄjÄ lietotÄja vÄrds.
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."
}
Å Ä« skripta palaiÅ”ana izskatÄs Å”Ädi:
Set-Autologon -Password "PlaintextPassword"
KÄ lietot
Tagad paskatÄ«simies, kÄ pats autors to visu izmanto. KÄ pareizi izvietot publisku Minecraft serveri operÄtÄjsistÄmÄ Windows. SÄksim no paÅ”a sÄkuma.
1. Izveidojiet lietotÄju
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. ReÄ£istrÄjiet uzdevumu, lai palaistu skriptu
JÅ«s varat reÄ£istrÄties, izmantojot Å”Ädu moduli:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
Vai arī izmantojiet standarta rīkus:
$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
3. IespÄjojiet automÄtisko pieteikÅ”anos un restartÄjiet iekÄrtu
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
PabeigŔana
ScenÄriju veidojis autors, arÄ« sev, tÄpÄc ar prieku uzklausÄ«s jÅ«su ieteikumus scenÄrija uzlaboÅ”anai. Autors cer, ka viss Å”is kods jums vismaz minimÄli noderÄja un raksts bija interesants.
Avots: www.habr.com