Π˜Π΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ скрипт запуска сСрвСра Minecraft

Π˜Π΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ скрипт запуска сСрвСра Minecraft

Автор ΠΎΡ‡Π΅Π½ΡŒ Π»ΡŽΠ±ΠΈΡ‚ ΠΈΠ³Ρ€Ρƒ, ΠΈ сам являСтся администратором нСбольшого сСрвСра «чисто для Π΄Ρ€ΡƒΠ·Π΅ΠΉΒ». Как водится срСди Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ, Π½Π° сСрвСрС Π·Π°ΠΌΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ всС, Π° это Π²Π»Π΅Ρ‡Ρ‘Ρ‚ Π·Π° собой Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ ΠΊΠ°ΠΊ слСдствиС падСния. Π’Π°ΠΊ ΠΊΠ°ΠΊ Powershell Π°Π²Ρ‚ΠΎΡ€ Π·Π½Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ располоТСниС ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΎΠ² Π½Π° своСй ΡƒΠ»ΠΈΡ†Π΅, ΠΎΠ½ принял Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Β«Π›ΡƒΡ‡ΡˆΠΈΠΉ Π‘ΠΊΡ€ΠΈΠΏΡ‚ Для Запуска ΠœΠ°ΠΉΠ½ΠΊΡ€Π°Ρ„Ρ‚ 2020Β». Π­Ρ‚ΠΎΡ‚ ΠΆΠ΅ скрипт послуТил основой для шаблона Π² маркСтплСйсС Ruvds. Но всС исходники ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅. БСйчас ΠΏΠΎ порядку, ΠΊΠ°ΠΊ это всС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ.

НуТныС Π½Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ΠžΠ΄Π½Π°ΠΆΠ΄Ρ‹ поставив Π΅Ρ‰Π΅ ΠΏΠ°Ρ€Ρƒ ΠΌΠΎΠ΄ΠΎΠ² я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ сСрвСр, судя ΠΏΠΎ всСму, ΠΏΠ°Π΄Π°Π΅Ρ‚ Π±Π΅Π· объявлСния Π²ΠΎΠΉΠ½Ρ‹. Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π΅ писал ошибки Π² latest.log ΠΈΠ»ΠΈ Π² debug, Π° консоль, которая ΠΏΠΎ ΠΈΠ΄Π΅Π΅ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Π»Π° Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ, Π±Ρ‹Π»Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°.

НС Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ – Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π£ нас Π΅ΡΡ‚ΡŒ Powershell с ΠΊΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ΠΎΠΌ Tee-Object, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π΅Ρ€Ρ‘Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ Π² Ρ„Π°ΠΉΠ» ΠΈ Π² консоль ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

.handler.ps1 | Tee-Object .StandardOutput.txt -Append

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Powershell Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ StandardOutput ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Ρ„Π°ΠΉΠ». НС ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Start-Process, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²Π΅Ρ€Π½Π΅Ρ‚ System.ComponentModel.Component, Π° Π½Π΅ StandardOutput, Π° -RedirectStandardOutput сдСлаСт Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π²Π²ΠΎΠ΄ Π² консоль, Ρ‡Π΅Π³ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ.

АргумСнты запуска

ΠŸΠΎΡΡ‚Π°Π²ΠΈΠ² Ρ‚Ρƒ ΡΠ°ΠΌΡƒΡŽ ΠΏΠ°Ρ€Ρƒ ΠΌΠΎΠ΄ΠΎΠ², Π°Π²Ρ‚ΠΎΡ€ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ Π½Π° сСрвСрС ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти. А это Π½ΡƒΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ запуска. ВмСсто Ρ‚ΠΎΠ³ΠΎΒ Ρ‡Ρ‚ΠΎΠ±Ρ‹Β ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… Π² start.bat, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚Β ΠΏΡ€ΠΎΡΡ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот скрипт.

Π’Π°ΠΊ ΠΊΠ°ΠΊ Tee-Object Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ StandardOutput,Β Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° исполняСмый Ρ„Π°ΠΉΠ» вызываСтся Β«ΠŸΡ€ΡΠΌΠΎ Ρ‚Π°ΠΊΒ», придСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ скрипт. Π­Ρ‚ΠΎΡ‚ скрипт Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сам ΠΌΠ°ΠΉΠ½ΠΊΡ€Π°Ρ„Ρ‚. НачнСм с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Β Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Π»Π΅Π½ΠΈ, скрипт Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ запуска Π½Π° Π»Π΅Ρ‚Ρƒ. Для этого Π½Π°Ρ‡Π½Π΅ΠΌ с поиска послСднСй вСрсии forge.

$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ sort-object ΠΌΡ‹ всСгда Π±ΡƒΠ΄Π΅ΠΌ Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с самой большой Ρ†ΠΈΡ„Π΅Ρ€ΠΊΠΎΠΉ, сколько Π±Ρ‹ Π²Ρ‹ Ρ‚ΡƒΠ΄Π° ΠΈΡ… Π½Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ. Π£Π»ΡŒΡ‚ΠΈΠΌΠ°Ρ‚ΠΈΠ²Π½Π°Ρ лСнь.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ сСрвСру ΠΏΠ°ΠΌΡΡ‚ΡŒ. Для этого Π±Π΅Ρ€Π΅ΠΌ количСство систСмной памяти ΠΈ записываСм Π΅Π³ΠΎ сумму Π² string.

$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ автоматичСский пСрСзапуск

Автор Π²ΠΈΠ΄Π΅Π» .bat Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… людСй, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π»ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сСрвСр Π±Ρ‹Π» остановлСн. Π­Ρ‚ΠΎ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ссли Π½ΡƒΠΆΠ½ΠΎ просто ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΌΠΎΠ΄Π° ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ?
Π’Π΅ΠΏΠ΅Ρ€ΡŒ сдСлаСм ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ пСрСзапуск. Автор Ρ€Π°Π½Π΅Π΅ натыкался Π½Π° странныС скрипты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСзапускали сСрвСр Π½Π΅ смотря Π½Π° Ρ‚ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ сСрвСр Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠœΡ‹ ΠΆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ exitcode. Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ 0 ΠΊΠ°ΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅, ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ»ΡΡΠ°Ρ‚ΡŒ.

Π‘Π½Π°Ρ‡Π°Π»Π° создадим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сСрвСр Π² случаС Π΅Π³ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Write-Log
            Restart-Minecraft
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}

Π‘ΠΊΡ€ΠΈΠΏΡ‚ останСтся Π² Ρ†ΠΈΠΊΠ»Π΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° сСрвСр ΠΈΠ· своСй ΠΆΠ΅ консоли Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΡˆΡ‚Π°Ρ‚Π½ΠΎ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ /stop.

Если ΠΌΡ‹ всС Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π±Ρ‹ ΠΈ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρƒ запуска, Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, Π° Ρ‚Π°ΠΊΠΆΠ΅, ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

Для этого ΠΌΡ‹ записываСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Start-Process Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Π’ скриптС это выглядит Ρ‚Π°ΠΊ:

$global:Process = Start-Process -FilePath  "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru

А дальшС записываСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² Ρ„Π°ΠΉΠ». Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ возвращаСтся Π½Π°ΠΌ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ:

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

ВсС это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Add-Content ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ». НСмного причСсав, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΊΠΎΠΉ скрипт, Π° Π½Π° Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ 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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΡ„ΠΎΡ€ΠΌΠΈΠΌ скрипт с запуском handler’a.

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ Π°Π²Ρ‚ΠΎΠ·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°

Автор Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΌΠ°ΠΉΠ½ΠΊΡ€Π°Ρ„Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… вСрсий ΠΈΠ· Π»ΡŽΠ±Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ процСсс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² систСмС. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ стол ΠΈΠ»ΠΈ WinRm. Если Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сСрвСр ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ систСмы ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ администратора, Π½ΠΎ Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² систСму, Ρ‚ΠΎ Server.jar Π½Π΅ смоТСт Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ eula.txt ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ.

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠ²Ρ…ΠΎΠ΄ Π² систСму ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ добавлСния Ρ‚Ρ€Π΅Ρ… записСй Π² рССстр.

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

Π­Ρ‚ΠΎ нСбСзопасно. Π›ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΡƒΡ‚ плСйнтСкстом, поэтому ΠΏΠΎΠ΄ запуск сСрвСра Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ доступ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈΠ»ΠΈ Π² Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ·ΠΊΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартного администратора для этого катСгоричСски Π½Π΅ рСкомСндуСтся.

Π‘ Π°Π²Ρ‚ΠΎΠ²Ρ…ΠΎΠ΄ΠΎΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ таску ΠΏΠΎΠ΄ сСрвСр. Π—Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π±ΡƒΠ΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ· Powershell, поэтому Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊ:

$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

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΡ„ΠΎΡ€ΠΌΠΈΠΌ всС Π² ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… скриптов Ρ‚ΡƒΡ‚, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ.

ВсС описанноС Π²Ρ‹ΡˆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, Ссли Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΌΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ с модулями.

Start-Minecraft

Π‘Π½Π°Ρ‡Π°Π»Π° сдСлаСм ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»ΡƒΡˆΠ°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ standardoutput.

Π’ Π±Π»ΠΎΠΊΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΠ½ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ· ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΌΠ°ΠΉΠ½ΠΊΡ€Π°Ρ„Ρ‚ ΠΈ ΠΊΡƒΠ΄Π° ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΎΠ³.

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"

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΌΡƒ ΠΊ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΡŽ Handler.ps1

Π§Ρ‚ΠΎΠ±Ρ‹ наш скрипт ΠΌΠΎΠ³ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅, Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΎΠ½ запускаСт Oracle Java, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ дистрибутив, Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π°.

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

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

Π’ Π±Π»ΠΎΠΊΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² скрипт ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Username ΠΈ Password. Если Username Π½Π΅ Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

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."
 
}

Запуск этого скрипта выглядит Ρ‚Π°ΠΊ:

Set-Autologon -Password "PlaintextPassword"

Как ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ

БСйчас рассмотрим Ρ‚ΠΎ, ΠΊΠ°ΠΊ сам Π°Π²Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ всСм этим. Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ сСрвСр Minecraft Π½Π° Windows. НачнСм с самого Π½Π°Ρ‡Π°Π»Π°.

1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword

2. РСгистрируСм Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎ запуску скрипта

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля, Ρ‚Π°ΠΊ:

Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"

Или Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стандартными срСдствами:

$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. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π°Π²Ρ‚ΠΎΠ²Ρ…ΠΎΠ΄ Π² систСму ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΌΠ°ΡˆΠΈΠ½Ρƒ

Set-Autologon -Username "MinecraftServer" -Password "Qw3"

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅

Автор Π΄Π΅Π»Π°Π» скрипт, Π² Ρ‚ΠΎΠΌ числС ΠΈ для сСбя, поэтому, с ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅ΠΌ Π²Ρ‹ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ ваши прСдлоТСния ΠΏΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ скрипта. Автор надССтся, Ρ‡Ρ‚ΠΎ вСсь этот ΠΊΠΎΠ΄ Π±Ρ‹Π» для вас хотя Π±Ρ‹ минимально ΠΏΠΎΠ»Π΅Π·Π΅Π½, Π° ΡΡ‚Π°Ρ‚ΡŒΡ интСрСсна.

Π˜Π΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ скрипт запуска сСрвСра Minecraft

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com