L-awtur iħobb ħafna l-logħba, u hu stess huwa l-amministratur ta 'server żgħir "purament għall-ħbieb." Bħas-soltu fost id-dilettanti, kollox fuq is-server huwa modded, u dan jinvolvi instabbiltà u, bħala riżultat, ħabtiet. Peress li l-awtur ta 'Powershell jaf aħjar mill-post tal-ħwienet fit-triq tiegħu, iddeċieda li jagħmel "L-Aħjar Skript biex Tniedi Minecraft 2020" L-istess kitba serviet bħala l-bażi għall-mudell in
Il-kmandi li għandna bżonn
Logging alternattiv
Ġurnata waħda, wara li installajt ftit mods aktar, skoprejt li s-server, apparentement, kien qed jiġġarraf mingħajr ma ddikjara gwerra. Is-server ma kitebx żbalji f'latest.log jew fid-debug, u l-console, li fit-teorija kellu kiteb dan l-iżball u waqaf, ingħalaq.
Jekk ma jridx jikteb, m'għandux għalfejn. Għandna Powershell b'cmdlet Tee-Oġġett, li jieħu oġġett u joħroġh għal fajl u għall-console fl-istess ħin.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Dan il-mod, Powershell se jiġbor l-StandardOutput u jiktbu f'fajl. Tippruvax tuża Bidu-Proċessgħax se jirritorna System.ComponentModel.Component u mhux StandardOutput, u -RedirectStandardOutput jagħmilha impossibbli li tidħol fil-console, li huwa dak li rridu nevitaw.
Tnedija argumenti
Wara li installa dak l-istess par ta 'mods, l-awtur innota li s-server ukoll ma kellux biżżejjed RAM. U dan jeħtieġ li jinbidlu l-argumenti tat-tnedija. Minflok ma tbiddelhom kull darba f'start.bat, li kulħadd juża, uża biss dan l-iskript.
Peress li Tee-Object jaqra biss StandardOutput meta l-eżekutibbli jissejjaħ "Just Like This", ser ikollok tagħmel skript ieħor. Dan l-iskript se jiġi mniedi minn Minecraft innifsu. Nibdew bl-argumenti.
Sabiex jipprattika l-għażż aħħari fil-futur, l-iskript irid jiġbor argumenti tat-tnedija fuq il-fly. Biex tagħmel dan, ejja nibdew billi tfittex l-aħħar verżjoni ssawwar.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Bl-użu sort-object, aħna dejjem se nieħdu l-oġġett bl-akbar numru, irrispettivament minn kemm minnhom tpoġġi hemm. Għażż aħħari.
Issa għandek bżonn tassenja memorja lis-server. Biex tagħmel dan, ħu l-ammont ta 'memorja tas-sistema u ikteb l-ammont tagħha f'sekwenza.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Irristartja awtomatika korretta
L-awtur ra fajls .bat minn nies oħra, iżda ma qiesx ir-raġuni għaliex is-server twaqqaf. Dan huwa inkonvenjenti, x'jiġri jekk għandek bżonn biss li tibdel il-fajl mod jew tħassar xi ħaġa?
Issa ejja nagħmlu mill-ġdid kif suppost. L-awtur qabel sab skripts strambi li reġgħu bdew is-server irrispettivament minn għaliex is-server għalaq. Aħna se nużaw exitcode. Java juża 0 bħala suċċess, għalhekk aħna ser niżfin minn hawn.
L-ewwel, ejja noħolqu funzjoni li terġa 'tibda s-server jekk ifalli.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
L-iskript se jibqa 'fil-linja sakemm is-server jagħlaq normalment mill-console tiegħu stess billi juża l-kmand /stop.
Jekk niddeċiedu li nawtomatizzaw kollox, allura jkun sabiħ li niġbru d-data tal-bidu, id-data tat-tlestija, u wkoll ir-raġuni għat-tlestija.
Biex tagħmel dan, niktbu r-riżultat ta 'Start-Process f'varjabbli. Fl-iskrittura tidher hekk:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
U mbagħad niktbu r-riżultati f'fajl. Dan huwa dak li jiġi rritornat lilna fil-varjabbli:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Dan kollu jista 'jiġi miżjud ma' fajl billi tuża Żid-Kontenut. Wara li mimxuta ftit, niksbu din l-iskrittura, u ejja nsejħulha 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
Issa ejja noħolqu b'kitba li tniedi handler.
L-istartjar korrett
L-awtur irid imexxi verżjonijiet differenti ta 'Minecraft minn kwalunkwe mogħdija f'modulu wieħed, u jkun jista' wkoll jaħżen zkuk f'folder speċifiku.
Il-problema hija li l-proċess għandu jinbeda minn utent li jkun illoggjat fis-sistema. Dan jista 'jsir permezz tad-desktop jew WinRm. Jekk tmexxi s-server bħala utent tas-sistema jew saħansitra amministratur, iżda ma tidħolx, allura Server.jar lanqas biss ikun jista' jaqra eula.txt u jibda.
Nistgħu nippermettu login awtomatiku billi nżidu tliet entrati fir-reġistru.
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
Mhuwiex sigur. Il-login u l-password huma indikati hawn b'test sempliċi, għalhekk biex tibda s-server trid toħloq utent separat li jkollu aċċess fil-livell tal-utent, jew fi grupp saħansitra aktar dejjaq. Huwa strettament mhux rakkomandat li tuża amministratur standard għal dan.
Irranġajna l-awto-login. Issa għandek bżonn tirreġistra kompitu ġdid għas-server. Aħna se nħaddmu l-kmand minn Powershell, għalhekk se tidher bħal din:
$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
Armar tal-modulu
Issa ejja npoġġu kollox f'moduli li jistgħu jintużaw aktar tard. Il-kodiċi kollu għal skripts lesti huwa hawn, importazzjoni u użu.
Tista 'tuża dak kollu deskritt hawn fuq separatament jekk ma tridx tolqot bil-moduli.
Ibda-Minecraft
L-ewwel, ejja noħolqu modulu li mhu se jagħmel xejn aktar milli tmexxi script li se jisma 'u jirreġistra output standard.
Fil-blokk tal-parametri, huwa jistaqsi minn liema folder tniedi Minecraft u fejn tpoġġi l-ġurnal.
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
U ser ikollok bżonn tniedi Minecraft bħal dan:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
Issa ejja ngħaddu għal Handler.ps1 lest għall-użu
Sabiex l-iskrittura tagħna taċċetta parametri meta tissejjaħ, irridu wkoll nispeċifikaw blokka tal-parametri. Jekk jogħġbok innota, taħdem Oracle Java, jekk qed tuża distribuzzjoni differenti ser ikollok bżonn tibdel il-mogħdija għall-fajl eżekutibbli.
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ġistru-Minecraft
L-iskript huwa prattikament l-istess bħal Start-Minecraft, ħlief li jirreġistra biss kompitu ġdid. Jaċċetta l-istess argumenti. L-isem tal-utent, jekk mhux speċifikat, jieħu dak attwali.
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ġistru-Autologon
Fil-blokk tal-parametri, l-iskrittura jaċċetta l-parametri Username u Password. Jekk Username ma kienx speċifikat, jintuża l-isem tal-utent attwali.
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."
}
It-tħaddim ta' dan l-iskritt jidher bħal dan:
Set-Autologon -Password "PlaintextPassword"
Kif tuża
Issa ejja nħarsu lejn kif l-awtur innifsu juża dan kollu. Kif tuża sew server pubbliku ta' Minecraft fuq il-Windows. Nibdew mill-bidu nett.
1. Oħloq utent
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Irreġistra l-kompitu biex tmexxi l-iskript
Tista' tirreġistra billi tuża modulu bħal dan:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
Jew uża għodod standard:
$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. Ippermetti l-login awtomatiku u reboot il-magna
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
Tlestija
L-awtur għamel l-iskrittura, inkluż għalih innifsu, għalhekk, se jkun kuntent li jisma 's-suġġerimenti tiegħek għat-titjib tal-iskrittura. L-awtur jittama li dan il-kodiċi kollu kien għall-inqas minimament utli għalik, u li l-artiklu kien interessanti.
Sors: www.habr.com