La aŭtoro tre amas la ludon, kaj li mem estas la administranto de malgranda servilo "nure por amikoj". Kiel kutime inter amatoroj, ĉio sur la servilo estas moddita, kaj ĉi tio kunportas malstabilecon de laboro kaj, kiel rezulto, falon. Ĉar la aŭtoro konas Powershell pli bone ol la loko de vendejoj sur sia strato, li decidis fari "Plej Bona Skripto Por Lanĉi Minecraft 2020". La sama skripto servis kiel bazo por la ŝablono en
La komandoj, kiujn ni bezonas
Alternativa arbohakado
Post kiam mi instalis kelkajn pliajn modifojn, mi trovis, ke la servilo, ŝajne, kraŝis sen deklari militon. La servilo ne skribis erarojn al latest.log aŭ debug, kaj la konzolo, kiu, en teorio, devis skribi ĉi tiun eraron kaj halti, estis fermita.
Se vi ne volas skribi, ne faru. Ni havas Powershell kun cmdlet Tee-Objekto, kiu prenas objekton kaj eligas ĝin al dosiero kaj al la konzolo samtempe.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Do Powershell prenos la StandardOutput kaj skribos ĝin al dosiero. Ne provu uzi Komenco-Procezo, ĉar ĝi resendos System.ComponentModel.Component, ne StandardOutput, kaj -RedirectStandardOutput maligos ĝin tajpi en la konzolon, kio estas kion ni volas eviti.
Lanĉu Argumentojn
Instalinte la saman paron da modoj, la aŭtoro rimarkis, ke la servilo ankaŭ ne havas sufiĉe da RAM. Kaj necesas ŝanĝi la lanĉajn argumentojn. Anstataŭ ŝanĝi ilin ĉiufoje en start.bat, kiun ĉiuj uzas, simple uzu ĉi tiun skripton.
Ĉar Tee-Object legas StandardOutput nur kiam la ruleblaĵo nomiĝas "Tiel tiel", unu plia skripto devos esti farita. Ĉi tiu skripto funkcios Minecraft mem. Ni komencu per la argumentoj.
Por indulgi finfinan maldiligenton en la estonteco, la skripto devas kolekti lanĉajn argumentojn sur la flugo. Por fari tion, ni komencu serĉante la lastan version forĝas.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Kun sort-object , ni ĉiam prenos la objekton kun la plej granda nombro, kiom ajn vi metas tien. Finfina maldiligento.
Nun ni devas asigni memoron al la servilo. Por fari tion, ni prenas la kvanton da sistemmemoro kaj skribas ĝian kvanton al ĉeno.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Taŭga aŭtomata rekomenco
La aŭtoro vidis .bat dosierojn de aliaj homoj, sed ili ne konsideris la kialon, kial la servilo estis haltigita. Estas maloportune, kio se vi nur bezonas ŝanĝi la moddosieron aŭ forigi ion?
Nun ni faru ĝustan rekomencon. La aŭtoro antaŭe renkontis strangajn skriptojn, kiuj rekomencis la servilon sendepende de kial la servilo eliris. Ni uzos elirkodon. Java uzas 0 kiel sukceson, do ni dancu de tie.
Unue, ni kreu funkcion, kiu rekomencos la servilon se ĝi malsukcesos.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
La skripto restos en la buklo ĝis la servilo eliras normale el sia propra konzolo uzante la komandon /stop.
Se ni decidus aŭtomatigi ĉion, tiam estus bone kolekti la daton de lanĉo, fino, kaj ankaŭ la kialon de la fino.
Por fari tion, ni skribas la rezulton de Start-Process al variablo. En skripto ĝi aspektas jene:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
Kaj poste skribu la rezultojn al dosiero. Jen kio estas redonita al ni en variablo:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Ĉio ĉi povas esti aldonita al la dosiero uzante Add-Content. Brosinte iomete, ni ricevas tian skripton, sed ni nomas ĝin 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
Nun ni desegnu la skripton kun la lanĉo de la prizorganto.
Ĝusta aŭtoŝarĝo
La aŭtoro volas ruli Minecraft de diversaj versioj de iu ajn vojo kun unu modulo, kaj ankaŭ povi meti protokolojn en specifan dosierujon.
La problemo estas, ke la procezo devas esti komencita de uzanto, kiu estas ensalutinta. Ĉi tio povas esti farita per la labortablo aŭ WinRm. Se vi rulas la servilon kiel sistemo aŭ eĉ administranto, sed ne ensalutas, tiam Server.jar eĉ ne povos legi eula.txt kaj komenci.
Ni povas ebligi aŭtologon aldonante tri enirojn al la registro.
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
Ĝi ne estas sekura. La ensaluto kaj pasvorto estas indikitaj ĉi tie per klarteksto, do por komenci la servilon vi devas krei apartan uzanton, kiu havas aliron ĉe la uzantnivelo, aŭ en eĉ pli mallarĝa grupo. Uzado de la norma administranto por ĉi tio estas forte malrekomendita.
Ni eltrovis la aŭtomatan ensalutigon. Nun vi devas registri novan taskon por la servilo. Ni rulos la komandon de Powershell, do ĝi aspektos jene:
$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
Kunvenado de la modulo
Nun ni aranĝu ĉion en moduloj uzeblaj poste. Ĉiuj kodoj de pretaj skriptoj estas ĉi tie, importu kaj uzu.
Vi povas uzi ĉion supre priskribitan aparte, se vi ne volas ĝeni modulojn.
komenci Minecraft
Unue, ni faru modulon, kiu faros nenion krom ruli skripton, kiu aŭskultos kaj skribos al norma eligo.
En la parametrobloko, li demandas de kiu dosierujo lanĉi Minecraft kaj kie meti la protokolon.
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
Kaj vi devos ruli Minecraft tiel:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
Nun ni transiru al la uzebla Handler.ps1
Por ke nia skripto akceptu parametrojn kiam oni vokis, ni ankaŭ devas specifi parametroblokon. Bonvolu noti, ke ĝi funkcias Oracle Java, se vi uzas alian distribuon, vi devos ŝanĝi la vojon al la plenumebla dosiero.
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
registri minecraft
La skripto estas preskaŭ la sama kiel Start-Minecraft, krom ke ĝi nur registras novan taskon. Akceptas la samajn argumentojn. La uzantnomo, se ne specifita, prenas la nunan.
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
Registru-Aŭtomata ensaluto
En la parametrobloko, la skripto akceptas la Uzantnomo kaj Pasvorto-parametroj. Se Uzantnomo ne estas specifita, la nuna uzantonomo estas uzata.
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."
}
Ruli ĉi tiun skripton aspektas jene:
Set-Autologon -Password "PlaintextPassword"
Kiel uzi
Nun konsideru kiel la aŭtoro mem uzas ĉion ĉi. Kiel ĝuste disfaldi Minecraft publikan servilon en Vindozo. Ni komencu de la komenco mem.
1. Kreu uzanton
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Registru la taskon por ruli la skripton
Vi povas registriĝi kun modulo tiel:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
Aŭ uzu la normajn ilojn:
$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. Enŝaltu aŭtomatan saluton kaj rekomencu la maŝinon
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
Kompletigo
La aŭtoro faris la skripton, inkluzive por si mem, tial li volonte aŭskultos viajn sugestojn por plibonigi la skripton. La aŭtoro esperas, ke ĉi tiu tuta kodo estis almenaŭ minimume utila por vi, kaj la artikolo estas interesa.
fonto: www.habr.com