Höfundurinn elskar leikinn mjög mikið og sjálfur er hann stjórnandi á litlum netþjóni „aðeins fyrir vini“. Eins og venjulega meðal áhugamanna er allt á þjóninum breytt og það hefur í för með sér óstöðugleika og þar af leiðandi hrun. Þar sem höfundur Powershell veit betur en staðsetningu verslana við götu hans ákvað hann að gera "Besta handritið til að ræsa Minecraft 2020" Sama handritið var grundvöllur sniðmátsins í
Skipanirnar sem við þurfum
Альтернативное логирование
Einn daginn, eftir að hafa sett upp nokkur mods í viðbót, uppgötvaði ég að þjónninn, greinilega, var að hrynja án þess að lýsa yfir stríði. Þjónninn skrifaði ekki villur í latest.log eða í debug og vélinni, sem fræðilega hefði átt að skrifa þessa villu og stöðvast, var lokað.
Ef hann vill ekki skrifa, þá þarf hann þess ekki. Við erum með Powershell með cmdlet Tee-Object, sem tekur hlut og sendir hann út í skrá og á stjórnborðið á sama tíma.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Таким образом, Powershell будет забирать StandardOutput и записывать его в файл. Не пытайтесь использовать Upphafsferlivegna þess að það mun skila System.ComponentModel.Component en ekki StandardOutput, og -RedirectStandardOutput mun gera það ómögulegt að komast inn í stjórnborðið, sem er það sem við viljum forðast.
Ræstu rök
Eftir að hafa sett upp sama par af mods tók höfundurinn eftir því að þjónninn var líka ekki með nóg vinnsluminni. Og þetta krefst þess að breyta upphafsrökum. Í stað þess að breyta þeim í hvert skipti í start.bat, sem allir nota, notaðu bara þetta script.
Þar sem Tee-Object les aðeins StandardOutput þegar keyrslan heitir "Just Like This", verður þú að búa til annað handrit. Þetta handrit verður hleypt af stokkunum af Minecraft sjálfu. Byrjum á rökunum.
Чтобы в будущем предаваться ультимативной лени, скрипт должен собирать аргументы запуска на лету. Для этого начнем с поиска последней версии móta.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Með því að nota sort-object munum við alltaf taka hlutinn með stærstu töluna, sama hversu marga af þeim þú setur þar. Fullkomin leti.
Nú þarftu að úthluta minni til þjónsins. Til að gera þetta skaltu taka magn kerfisminni og skrifa magn þess í streng.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Rétt sjálfvirk endurræsing
Höfundur hefur séð .bat skrár frá öðru fólki, en þeir tóku ekki tillit til ástæðunnar fyrir því að þjónninn var stöðvaður. Þetta er óþægilegt, hvað ef þú þarft bara að breyta mod skránni eða eyða einhverju?
Nú skulum við endurræsa almennilega. Höfundur rakst áður á undarlegar forskriftir sem endurræstu þjóninn óháð því hvers vegna þjónninn lokaðist. Við munum nota exitcode. Java notar 0 sem árangur, svo við munum dansa héðan.
Í fyrsta lagi skulum við búa til aðgerð sem mun endurræsa þjóninn ef það mistekst.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Скрипт останется в цикле до тех пор, пока сервер из своей же консоли не завершит работу штатно, с помощью команды /stop.
Ef við ákveðum að gera allt sjálfvirkt, þá væri gaman að safna upphafsdagsetningu, lokadagsetningu og einnig ástæðunni fyrir því.
Til að gera þetta skrifum við niðurstöðu Start-Process í breytu. Í handritinu lítur það svona út:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
Og svo skrifum við niðurstöðurnar í skrá. Þetta er það sem er skilað til okkar í breytunni:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Allt þetta er hægt að bæta við skrá með Add-Content. Eftir að hafa greitt það aðeins, fáum við þetta handrit og við skulum kalla það 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
Nú skulum við búa til handrit sem ræsir stjórnanda.
Rétt gangsetning
Автор хочет одним модулем запускать майнкрафт различных версий из любых путей, а также иметь возможность складывать логи в конкретную папку.
Vandamálið er að ferlið verður að hefjast af notanda sem er skráður inn í kerfið. Þetta er hægt að gera í gegnum skjáborðið eða WinRm. Ef þú keyrir þjóninn sem kerfisnotandi eða jafnvel stjórnandi, en skráir þig ekki inn, þá mun Server.jar ekki einu sinni geta lesið eula.txt og byrjað.
Við getum virkjað sjálfvirka innskráningu með því að bæta þremur færslum við skrárinn.
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
Það er ekki öruggt. Innskráningin og lykilorðið eru tilgreind hér í látlausum texta, svo til að ræsa netþjóninn þarftu að búa til sérstakan notanda sem hefur aðgang á notendastigi, eða í enn þrengri hópi. Það er stranglega ekki mælt með því að nota venjulegan stjórnanda fyrir þetta.
Við redduðum sjálfvirkri innskráningu. Nú þarftu að skrá nýtt verkefni fyrir þjóninn. Við munum keyra skipunina frá Powershell, svo hún mun líta svona út:
$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
Samsetning einingarinnar
Nú skulum við setja allt í einingar sem hægt er að nota síðar. Allur kóðinn fyrir tilbúin skriftur er hér, fluttur inn og notaður.
Þú getur notað allt sem lýst er hér að ofan sérstaklega ef þú vilt ekki trufla einingar.
Start-Minecraft
Сначала сделаем модуль, который только и будет делать, что запускать скрипт, который будет слушать и записывать standardoutput.
Í færibreytublokkinni spyr hann úr hvaða möppu eigi að ræsa Minecraft og hvar eigi að setja skrána.
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
А запускать майнкрафт нужно будет так:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
Nú skulum við halda áfram í Handler.ps1 sem er tilbúið til notkunar
Til þess að handritið okkar geti samþykkt færibreytur þegar það er kallað, þurfum við líka að tilgreina færibreytublokk. Vinsamlegast athugaðu að það keyrir Oracle Java, ef þú ert að nota aðra dreifingu þarftu að breyta slóðinni að keyrsluskránni.
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
Skrá-Minecraft
Скрипт, практически, повторяет Start-Minecraft, за исключением того, что только регистрирует новую задачу. Принимает те же самые аргументы. Имя пользователя, если не было указано, берет текущего.
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
Register-Autologon
Í færibreytublokkinni samþykkir handritið færibreyturnar Notandanafn og Lykilorð. Ef notandanafn var ekki tilgreint er nafn núverandi notanda notað.
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."
}
Að keyra þetta handrit lítur svona út:
Set-Autologon -Password "PlaintextPassword"
Hvernig á að nota
Nú skulum við skoða hvernig höfundurinn sjálfur notar þetta allt. Hvernig á að dreifa almennum Minecraft netþjóni almennilega á Windows. Við skulum byrja alveg frá upphafi.
1. Búðu til notanda
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Skráðu verkefnið til að keyra handritið
Þú getur skráð þig með einingu eins og þessari:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
Eða notaðu venjuleg verkfæri:
$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. Virkjaðu sjálfvirka innskráningu og endurræstu vélina
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
Frágangur
Höfundur gerði handritið, þar á meðal fyrir sjálfan sig, því mun hann gjarnan hlusta á tillögur þínar til að bæta handritið. Höfundur vonar að allur þessi kóði hafi verið að minnsta kosti lítið gagnlegur fyrir þig og að greinin hafi verið áhugaverð.
Heimild: www.habr.com