Ideāls Minecraft servera palaišanas skripts

Ideāls Minecraft servera palaišanas skripts

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 Ruvds tirgū. 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 -Append

Tā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 1

Izmantojot 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 -PassThru

Tad mēs ierakstām rezultātus failā. Lūk, kas tiek atgriezts mūsu mainīgajā:

$global:Process.StartTime
$global:Process.ExitCode	
$global:Process.ExitTime

Viss 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 SilentlyContinue

Tas 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 Highest

Sagatavojam 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-Minecraft

Un 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-Minecraft

Register-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 -UserMayNotChangePassword

2. 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 Highest

3. 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.

Ideāls Minecraft servera palaišanas skripts

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster