Avtorju je igra zelo všeč in sam je skrbnik majhnega strežnika »izključno za prijatelje«. Kot je med amaterji v navadi, je na strežniku vse modificirano, kar potegne za seboj nestabilnost in posledično zrušitve. Ker avtor Powershell bolje pozna lokacijo trgovin na njegovi ulici, se je odločil narediti "Najboljši skript za zagon Minecraft 2020" Isti scenarij je služil kot osnova za predlogo v
Ukazi, ki jih potrebujemo
Alternativna sečnja
Nekega dne, ko sem namestil še nekaj modifikacij, sem odkril, da se strežnik očitno sesuje, ne da bi napovedal vojno. Strežnik ni zapisal napak v latest.log ali v debug in konzola, ki bi teoretično morala napisati to napako in se ustaviti, je bila zaprta.
Če noče pisati, mu ni treba. Imamo Powershell s cmdlet Tee-Object, ki vzame predmet in ga hkrati izpiše v datoteko in na konzolo.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Na ta način bo Powershell prevzel StandardOutput in ga zapisal v datoteko. Ne poskušajte uporabiti Start-Procesker bo vrnil System.ComponentModel.Component in ne StandardOutput, in -RedirectStandardOutput bo onemogočil vstop v konzolo, čemur se želimo izogniti.
Zagon argumentov
Po namestitvi istega para modov je avtor opazil, da tudi strežnik nima dovolj RAM-a. In to zahteva spreminjanje argumentov za zagon. Namesto da jih spreminjate vsakič v start.batu, ki ga vsi uporabljajo, preprosto uporabite ta skript.
Ker Tee-Object bere StandardOutput samo, ko se izvršljiva datoteka imenuje "Tako kot ta", boste morali narediti drug skript. Ta skript bo zagnal sam Minecraft. Začnimo z argumenti.
Da bi se v prihodnosti lahko prepustili ultimativni lenobi, mora skript sproti zbirati argumente za zagon. Če želite to narediti, začnimo z iskanjem najnovejše različice ponarejali.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Z uporabo sort-object bomo vedno vzeli objekt z največjim številom, ne glede na to, koliko jih postavite tja. Končna lenoba.
Zdaj morate strežniku dodeliti pomnilnik. Če želite to narediti, vzemite količino sistemskega pomnilnika in zapišite njegovo količino v niz.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Pravilen samodejni ponovni zagon
Avtor je videl datoteke .bat od drugih ljudi, vendar niso upoštevali razloga za zaustavitev strežnika. To je neprijetno, kaj pa, če morate samo spremeniti mod datoteko ali nekaj izbrisati?
Zdaj pa naredimo pravi ponovni zagon. Avtor je prej naletel na čudne skripte, ki so znova zagnale strežnik ne glede na to, zakaj se je strežnik zaustavil. Uporabili bomo izhodno kodo. Java uporablja 0 kot uspeh, zato bomo plesali od tukaj.
Najprej ustvarimo funkcijo, ki bo znova zagnala strežnik, če ne uspe.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Skript bo ostal v zanki, dokler se strežnik ne zaustavi normalno iz lastne konzole z ukazom /stop.
Če se odločimo za avtomatizacijo vsega, potem bi bilo lepo zbrati začetni datum, datum zaključka in tudi razlog za dokončanje.
Da bi to naredili, zapišemo rezultat Start-Processa v spremenljivko. V scenariju je videti takole:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
In potem rezultate zapišemo v datoteko. To je tisto, kar nam vrne spremenljivka:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Vse to je mogoče dodati v datoteko z uporabo Add-Content. Ko smo malo prečesali, dobimo tale skript in ga poimenujmo 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
Zdaj pa ustvarimo skript, ki zažene upravljalnik.
Pravilen zagon
Avtor želi zagnati različne različice Minecrafta s katere koli poti v enem modulu in imeti tudi možnost shranjevanja dnevnikov v določeni mapi.
Težava je v tem, da mora postopek zagnati uporabnik, ki je prijavljen v sistem. To lahko storite prek namizja ali programa WinRm. Če strežnik zaženete kot sistemski uporabnik ali celo skrbnik, vendar se ne prijavite, potem Server.jar ne bo mogel prebrati niti eula.txt in se zagnati.
Samodejno prijavo lahko omogočimo z dodajanjem treh vnosov v register.
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
Ni varno. Prijava in geslo sta tukaj navedena v golem besedilu, zato morate za zagon strežnika ustvariti ločenega uporabnika, ki ima dostop na ravni uporabnika ali v še ožji skupini. Za to strogo ni priporočljivo uporabljati standardnega skrbnika.
Uredili smo samodejno prijavo. Zdaj morate registrirati novo nalogo za strežnik. Ukaz bomo zagnali iz Powershell-a, tako da bo videti takole:
$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
Sestavljanje modula
Zdaj pa dajmo vse v module, ki jih lahko uporabimo pozneje. Vsa koda za že pripravljene skripte je tukaj, uvozite in uporabite.
Vse zgoraj opisano lahko uporabite ločeno, če se ne želite obremenjevati z moduli.
Start-Minecraft
Najprej ustvarimo modul, ki ne bo naredil nič drugega kot zagnal skript, ki bo poslušal in posnel standardni izhod.
V bloku parametrov vpraša, iz katere mape naj zažene Minecraft in kam naj shrani dnevnik.
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
In Minecraft boste morali zagnati takole:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
Zdaj pa preidimo na Handler.ps1, ki je pripravljen za uporabo
Da bi naš skript sprejel parametre ob klicu, moramo podati tudi blok parametrov. Upoštevajte, da izvaja Oracle Java, če uporabljate drugo distribucijo, boste morali spremeniti pot do izvršljive datoteke.
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
Registracija-Minecraft
Skript je praktično enak Start-Minecraftu, le da registrira samo novo nalogo. Sprejema iste argumente. Uporabniško ime, če ni določeno, prevzame trenutno.
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
Registracija-Autologon
V bloku parametrov skript sprejme parametra Uporabniško ime in Geslo. Če uporabniško ime ni podano, se uporabi ime trenutnega uporabnika.
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."
}
Zagon tega skripta izgleda takole:
Set-Autologon -Password "PlaintextPassword"
Kako uporabljati
Zdaj pa poglejmo, kako vse to uporablja avtor sam. Kako pravilno namestiti javni strežnik Minecraft v sistemu Windows. Začnimo od samega začetka.
1. Ustvarite uporabnika
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Registrirajte opravilo za zagon skripta
Registrirate se lahko s pomočjo modula, kot je ta:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
Ali pa uporabite standardna orodja:
$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. Omogočite samodejno prijavo in znova zaženite stroj
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
Zaključek
Avtor je scenarij naredil tudi zase, zato bo z veseljem prisluhnil vašim predlogom za izboljšavo scenarija. Avtor upa, da vam je bila vsa ta koda vsaj minimalno uporabna in da je bil članek zanimiv.
Vir: www.habr.com