Autors ļoti mīl šo spēli un pats ir neliela servera administrators "tikai draugiem". Kā ierasts starp entuziastiem, serverī ir daudzi modi, kas noved pie nestabilitātes un, kā rezultātā, servera avārijām. Tā kā autoram PowerShell zināšanas ir labākas, nekā viņa ielu veikalu atrašanās vietas, viņš nolēma izveidot "Labākais skripts Minecraft palaišanai 2020.Šis pats skripts kalpoja kā pamats šablonam . Bet visi avoti jau ir rakstā. Tagad soli pa solim, kā tas viss tika īstenots.
Mums nepieciešamās komandas
Alternatīva žurnālu ierakstīšana
Reiz, uzstādot vēl pāris modu, es pamanīju, ka serveris, šķiet, avarē bez brīdinājuma. Serveris nereģistrēja kļūdas latest.log vai debug, bet konsolē, kurai šai kļūdai būtu jābūt reģistrētai un jāapstājas, bija aizvērta.
Ja nevēlas rakstīt – nevajag. Mums ir PowerShell ar komandu Tee-Object, kas ņem objektu un vienlaicīgi izvada to failā un konsolē.
.handler.ps1 | Tee-Object .StandardOutput.txt -AppendTādējādi PowerShell ņems StandardOutput un ierakstīs to failā. Nepūlēties izmantot Start-Process, jo tas atgriezīs System.ComponentModel.Component, nevis StandardOutput, un -RedirectStandardOutput padarīs neiespējamu ievadi konsolē, ko mēs vēlamies izvairīties.
Palaišanas argumenti
Uzstādot to pašu pāri modu, autors pamanīja, ka serverim trūkst operatīvās atmiņas. Un tas ir jāmaina palaišanas argumentos. Tā vietā, lai katru reizi mainītu tos start.bat, ko visi izmanto, vienkārši izmantojiet šo skriptu.
Tā kā Tee-Object lasa StandardOutput tikai tad, kad izpildāmais fails tiek izsaukts "Tāpat", būs jādara vēl viens skripts. Šis skripts palaidīs pašu Minecraft. Sāksim ar argumentiem.
Lai nākotnē nodarbotos ar ekstrēmu slinkumu, skriptam jābūt spējīgam uzkrāt palaišanas argumentus ''on the fly''. Tāpēc sāksim ar pēdējās versijas meklēšanu forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1Izmantojot sort-object, mēs vienmēr ņemsim objektu ar vislielāko skaitli, cik daudz jūs tur ievieto. Ekstrēms slinkums.
Tagad jāpiešķir serverim atmiņa. Tādēļ mēs ņemam sistēmas atmiņas apjomu un ierakstām tā summu virknē.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"Pareizs automātiskaisRestart
Autors bija redzējis .bat failus no citiem cilvēkiem, taču tie neņem vērā iemeslu, kāpēc servers tika apturēts. Tas ir neērti, ja vienkārši vajag nomainīt modifikācijas failu vai izdzēst kaut ko?
Tagad veiksim pareizu restartēšanu. Autors iepriekš bija sastapis dīvainus skriptus, kas restartēja serveri neskatoties uz to, kāpēc servers bija beidzis darbu. Mēs izmantosim exitcode. Java izmanto 0 kā veiksmīgu pabeigšanu, uz tā arī balstīsimies.
Vispirms izveidosim funkciju, kas restartēs serveri neizdošanās gadījumā.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Skripts paliks ciklā, līdz servers no savas konsoles normāli beigs darbu, izmantojot komandu /stop.
Ja mēs visu esam nolēmuši automatizēt, būtu arī jauki reģistrēt sākuma datumu, pabeigšanas datumu un pabeigšanas iemeslu.
Tāpēc mēs ierakstām rezultātu Start-Process mainīgajā. Skriptā tas izskatās šādi:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThruTad mēs ierakstām rezultātus failā. Lūk, kas tiek atgriezts mūsu mainīgajā:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeViss tas ar Add-Content palīdzību var tikt pievienots failam. Nedaudz to sakārtojot, saņemam šādu skriptu un nosauksim to par handler.ps1.
Add-Content -Value "Sākuma laiks:" -Path $Logfile
$global:Process.StartTime
Add-Content -Value "Pabeigšanas kods:" -Path $Logfile
$global:Process.ExitCode | Add-Content $Logfile
Add-Content -Value "Pabeigšanas laiks:" -Path $Logfile
$global:Process.ExitTime | Add-Content $Logfile
Tagad izveidosim skriptu ar handlera palaišanu.
Pareiza automātiskā ielāde
Autors vēlas, lai ar vienu moduļu varētu palaist Minecraft dažādas versijas no jebkuras vietas, kā arī būt spējīgam krāt žurnālus konkrētā mapē.
Problēma ir tāda, ka procesu jāpalaiž lietotājam, kurš ir sistēmā. To var izdarīt, izmantojot darbvirsmu vai WinRm. Ja serveri palaiž no sistēmas vārda vai pat administratora, taču neiesakoties sistēmā, tad Server.jar pat nevarēs izlasīt eula.txt un palaist.
Mēs varam aktivizēt automātisko pieteikšanos, pievienojot trīs ierakstus reģistrā.
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 SilentlyContinueTas nav droši. Lietotājs un parole tiek norādīti šeit atklātā tekstā, tāpēc servera palaišanai jāizveido atsevišķs lietotājs, kuram ir lietotāja līmeņa piekļuve vai vēl šaurākā grupā. Standarta administratora izmantošana šim nolūkam ir kategoriski nerekomendēta.
Ar automātisko pieteikšanos esam tikuši galā. Tagad jāreģistrē jauna uzdevums serverim. Mēs izmantosim komandu no PowerShell, tāpēc tas izskatīsies šādi:
$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 HighestSagatavojam moduli
Tagad aplūkosim visu kā moduļus, kurus varēsim izmantot vēlāk. Visi gatavo skriptu kodi šeit, importējiet un lietojiet.
Viss iepriekšminētais var tikt izmantots atsevišķi, ja nevēlaties apgrūtināt sevi ar moduļiem.
Start-Minecraft
Vispirms izveidosim moduli, kas vienīgi uzsāks skriptu, kurš klausīs un reģistrēs standarta izvadi.
Parametru blokā tiek pieprasīts, no kuras mapes palaist Minecraft un kur glabāt žurnālu.
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-MinecraftUn Minecraft būs jāsāk tā:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"Tagad pāriesim uz gatavajām Handler.ps1
Lai mūsu skripts varētu pieņemt parametrus izsaukuma laikā, ir jānorāda arī parametru bloks. Lūdzu, ņemiet vērā, ka tas uzsāk Oracle Java; ja izmantojat citu izplatījumu, būs jāmaina izpildfaila ceļš.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== Uzsākam dieva spēļu serveri ============"
$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 "Sākuma laiks:" $global:Process.StartTime
Write-host "Iziešanas kods:" $global:Process.ExitCode
Write-host "Iziešanas laiks:" $global:Process.ExitTime
Write-host "=============== Apstādīts dieva spēļu serveris ============="
}
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
Register-Minecraft
Šis skripts praktiski atkārto Start-Minecraft, izņemot to, ka tas tikai reģistrē jaunu uzdevumu. Tas pieņem tos pašus argumentus. Ja lietotājvārds nav norādīts, tiek izmantots pašreizējais.
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-MinecraftRegister-Autologon
Parametru blokā skripts pieņem parametrus Username un Password. Ja Username nav norādīts, tiek izmantots pašreizējā lietotāja vārds.
function Set-Autologon {
param (
[Parameter(
HelpMessage="Autologona lietotāja vārds")]
$Username = $env:USERNAME,
[Parameter(Mandatory=$true,
HelpMessage="Lietotāja parole")]
[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 aktivizēs lietotāja automātisko pieteikšanos."
}
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 "Autologs ir veiksmīgi iestatīts."
}
Šī skripta palaišana notiek šādi:
Set-Autologon -Password "PlaintextPassword"Kā izmantot
Tagad aplūkosim, kā pats autors izmanto visu šo. Kā pareizi jāsagatavo publiskais Minecraft serveris uz Windows. Sāksim no paša sākuma.
1. Izveidojam lietotāju
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. Reģistrējam uzdevumu skripta palaišanai
Varat reģistrēt, izmantojot moduli, šādi:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"Vai izmantot standarta rīkus:
$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 Highest3. Ieslēdzam automātisko pieteikšanos un restartējam mašīnu
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Nobeigums
Autors izveidoja skriptu, tostarp arī sev, tāpēc labprāt uzklausīs jūsu ierosinājumus par skripta uzlabošanu. Autors cer, ka šis viss kods bija jums vismaz nedaudz noderīgs, un raksts bija interesants.
Avots: habr.com
