Egileak asko maite du jokoa, eta bera da zerbitzari txiki baten administratzailea "lagunentzat soilik". Afizionatuen artean ohikoa den moduan, zerbitzarian dena moldatzen da, eta horrek lanaren ezegonkortasuna eta, ondorioz, erorketa dakar. Egileak Powershell bere kaleko denden kokapena baino hobeto ezagutzen duenez, egitea erabaki zuen "Minecraft 2020 abiarazteko gidoi onena". Script bera izan zen txantiloiaren oinarri gisa
Behar ditugun aginduak
Erregistro alternatiboa
Pare bat mod gehiago instalatu ondoren, zerbitzaria, itxuraz, gerra deklaratu gabe huts egiten ari zela ikusi nuen. Zerbitzariak ez zuen akatsik idatzi latest.log edo debug-en, eta kontsola, teorian errore hori idatzi eta gelditu behar zuen kontsola itxi egin zen.
Ez baduzu idatzi nahi, ez. Powershell dugu cmdlet batekin Tee-Objektua, objektu bat hartu eta aldi berean fitxategi batera eta kontsolara ateratzen duena.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Beraz, Powershell-ek StandardOutput jasoko du eta fitxategi batean idatziko du. Ez saiatu erabiltzen Hasi-Prozesua, System.ComponentModel.Component bat itzuliko duelako, ez StandardOutput bat, eta -RedirectStandardOutput-ek ezinezko egingo du kontsolan idaztea, hori da saihestu nahi duguna.
Abiarazi Argumentuak
Mod pare bera instalatu ondoren, egileak zerbitzariak ere RAM nahikorik ez zuela ohartu zen. Eta abiaraztearen argudioak aldatzea beharrezkoa da. Guztiek erabiltzen duten start.bat-en aldi bakoitzean aldatu beharrean, erabili script hau.
Tee-Object-ek StandardOutput irakurtzen duenez, exekutagarria "Horrela" deitzen denean soilik, script bat gehiago egin beharko da. Script honek Minecraft bera exekutatuko du. Has gaitezen argudioekin.
Etorkizunean azken alferkeriaz gozatzeko, gidoiak abiaraztearen argudioak bildu behar ditu hegalean. Horretarako, has gaitezen azken bertsioa bilatzen Agorregi.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Sort-object-ekin, beti hartuko dugu kopuru handiena duen objektua, zenbat jartzen dituzun ere. Azken nagikeria.
Orain memoria esleitu behar diogu zerbitzariari. Horretarako, sistemaren memoria-kopurua hartu eta haren zenbatekoa katean idatziko dugu.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Berrabiarazte automatiko egokia
Egileak beste pertsona batzuen .bat fitxategiak ikusi ditu, baina ez dute kontuan hartu zerbitzaria gelditu izanaren arrazoia. Desegokia da, zer gertatzen da mod fitxategia aldatu edo zerbait ezabatu behar baduzu?
Orain egin dezagun berrabiarazi egoki bat. Egileak aurretik zerbitzaria berrabiarazten zuten script arraroekin topatu zituen zerbitzaria zergatik irten zen kontuan hartu gabe. Irteera kodea erabiliko dugu. Javak 0 erabiltzen du arrakasta gisa, beraz, dantza dezagun hortik.
Lehenik eta behin, sor dezagun zerbitzaria huts egiten badu berrabiaraziko duen funtzio bat.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Scripta begiztan egongo da zerbitzaria bere kontsolatik normalean irten arte /stop komandoa erabiliz.
Dena automatizatzea erabakiko bagenu, ondo legoke abiarazteko data, amaiera eta amaieraren arrazoia jasotzea.
Horretarako, Hasi-Prozesuaren emaitza aldagai batean idazten dugu. Gidoi batean honela ikusten da:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
Eta ondoren idatzi emaitzak fitxategi batean. Hona hemen aldagai batean itzultzen zaiguna:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Hau guztia fitxategira gehi daiteke Add-Content erabiliz. Apur bat eskuilatuta, halako script bat lortzen dugu, baina handler.ps1 deitzen diogu.
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
Orain diseina dezagun script-a kudeatzailea abiarazteko.
Autokarga egokia
Egileak hainbat bertsiotako minecraft exekutatu nahi du edozein bidetatik modulu batekin, eta erregistroak karpeta zehatz batean jartzeko gai izan.
Arazoa da prozesua saioa hasita dagoen erabiltzaile batek hasi behar duela. Hau mahaigainaren edo WinRm bidez egin daiteke. Zerbitzaria sistema edo administratzaile gisa exekutatzen baduzu, baina ez baduzu saioa hasten, Server.jar-ek ezingo du eula.txt irakurri eta hasi ere egin.
Autologon gaitu dezakegu erregistroan hiru sarrera gehituz.
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
Ez da segurua. Saio-hasiera eta pasahitza testu arruntaren bidez adierazten dira hemen, beraz, zerbitzaria abiarazteko, erabiltzaile-mailan sarbidea duen erabiltzaile bereizi bat sortu behar duzu, edo talde are estuago batean. Horretarako administratzaile estandarra erabiltzea gomendagarria da.
Saio automatikoa asmatu dugu. Orain zerbitzarirako zeregin berri bat erregistratu behar duzu. Powershell-etik komandoa exekutatuko dugu, beraz, itxura hau izango du:
$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
Modulua muntatzea
Orain antola dezagun dena geroago erabil daitezkeen moduluetan. Prest egindako scripten kode guztiak hemen daude, inportatu eta erabili.
Goian deskribatutako guztia bereiz erabil dezakezu moduluekin kezkatu nahi ez baduzu.
hasi minecraft
Lehenik eta behin, egin dezagun irteera estandarrean entzun eta idatziko duen script bat exekutatuko ez duen modulu bat.
Parametroen blokean, minecraft zein karpetatatik abiarazi eta erregistroa non jarri galdetzen du.
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
Eta minecraft honela exekutatu beharko duzu:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
Orain joan gaitezen erabiltzeko prest dagoen Handler.ps1ra
Gure script-ak deitzean parametroak onar ditzan, parametro bloke bat ere zehaztu behar dugu. Kontuan izan Oracle Java exekutatzen duela, beste banaketa bat erabiltzen ari bazara, fitxategi exekutagarriaren bidea aldatu beharko duzu.
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
erregistratu minecraft
Scripta ia Start-Minecraft-en berdina da, zeregin berri bat soilik erregistratzen duela izan ezik. Argudio berdinak onartzen ditu. Erabiltzaile izenak, zehazten ez bada, oraingoa hartzen du.
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
Erregistratu-Autologon
Parametro blokean, script-ak Erabiltzaile-izena eta Pasahitza parametroak onartzen ditu. Erabiltzaile-izena zehazten ez bada, uneko erabiltzailearen izena erabiliko da.
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."
}
Script hau exekutatzen honelakoa da:
Set-Autologon -Password "PlaintextPassword"
Nola erabili
Kontuan hartu orain egileak berak hau guztia nola erabiltzen duen. Nola zabaldu Minecraft zerbitzari publiko bat Windows-en. Has gaitezen hasiera-hasieratik.
1. Sortu erabiltzaile bat
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Erregistratu zeregina scripta exekutatzeko
Modulu batekin izena eman dezakezu honela:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
Edo erabili tresna estandarrak:
$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. Aktibatu hasierako saioa eta berrabiarazi makina
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
Amaiera
Egileak egin du gidoia, beretzat barne, beraz, pozik entzungo ditu gidoia hobetzeko zure iradokizunak. Egileak espero du kode hori guztia gutxienez gutxieneko baliagarria izan izana zuretzat, eta artikulua interesgarria da.
Iturria: www.habr.com