์ด์ƒ์ ์ธ Minecraft ์„œ๋ฒ„ ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ

์ด์ƒ์ ์ธ Minecraft ์„œ๋ฒ„ ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ

์ €์ž๋Š” ๊ฒŒ์ž„์„ ๋งค์šฐ ์ข‹์•„ํ•˜๋ฉฐ, ๊ทธ ์ž์‹ ๋„ "์ˆœ์ „ํžˆ ์นœ๊ตฌ๋ฅผ ์œ„ํ•œ" ์†Œ๊ทœ๋ชจ ์„œ๋ฒ„์˜ ๊ด€๋ฆฌ์ž์ž…๋‹ˆ๋‹ค. ์•„๋งˆ์ถ”์–ด๋“ค ์‚ฌ์ด์—์„œ ํ”ํžˆ ๊ทธ๋ ‡๋“ฏ์ด ์„œ๋ฒ„์˜ ๋ชจ๋“  ๊ฒƒ์ด ์ˆ˜์ •๋˜์–ด ๋ถˆ์•ˆ์ •์„ฑ์„ ์ดˆ๋ž˜ํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Powershell์˜ ์ €์ž๋Š” ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ์ƒ์  ์œ„์น˜๋ณด๋‹ค ๋” ์ž˜ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "Minecraft 2020์„ ์‹œ์ž‘ํ•˜๋Š” ์ตœ๊ณ ์˜ ์Šคํฌ๋ฆฝํŠธ" ๋™์ผํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ…œํ”Œ๋ฆฟ์˜ ๊ธฐ์ดˆ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Ruvds ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ถœ์ฒ˜๋Š” ์ด๋ฏธ ๊ธฐ์‚ฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ˆœ์„œ๋Œ€๋กœ ๋ชจ๋“  ์ž‘์—…์ด ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๋ช…๋ น

๋Œ€์ฒด ๋กœ๊น…

์–ด๋Š ๋‚  ๋ชจ๋“œ๋ฅผ ๋ช‡ ๊ฐœ ๋” ์„ค์น˜ํ•œ ํ›„ ์ „์Ÿ์„ ์„ ํฌํ•˜์ง€๋„ ์•Š์€ ์ฑ„ ์„œ๋ฒ„๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ตœ์‹  ๋กœ๊ทธ๋‚˜ ๋””๋ฒ„๊ทธ์— ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ด๋ก ์ ์œผ๋กœ ์ด ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์ค‘์ง€ํ–ˆ์–ด์•ผ ํ•˜๋Š” ์ฝ˜์†”์ด ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค.

๊ธ€์„ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๊ธ€์„ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. cmdlet์ด ํฌํ•จ๋œ Powershell์ด โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ํ‹ฐ-์˜ค๋ธŒ์ ํŠธ, ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ๋™์‹œ์— ํŒŒ์ผ๊ณผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

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

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Powershell์ด โ€‹โ€‹StandardOutput์„ ์„ ํƒํ•˜์—ฌ ํŒŒ์ผ์— ์”๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜์ง€ ๋งˆ์„ธ์š” ์‹œ์ž‘ ํ”„๋กœ์„ธ์Šค์™œ๋ƒํ•˜๋ฉด StandardOutput์ด ์•„๋‹Œ System.ComponentModel.Component๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  -RedirectStandardOutput์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ˜์†”์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ”ผํ•˜๊ณ  ์‹ถ์€ ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ธ์ˆ˜ ์‹คํ–‰

๋™์ผํ•œ ๋ชจ๋“œ ์Œ์„ ์„ค์น˜ํ•œ ํ›„ ์ž‘์„ฑ์ž๋Š” ์„œ๋ฒ„์—๋„ RAM์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์‹œ์ž‘ ์ธ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” start.bat์—์„œ ๋งค๋ฒˆ ๋ณ€๊ฒฝํ•˜๋Š” ๋Œ€์‹  ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

Tee-Object๋Š” ์‹คํ–‰ ํŒŒ์ผ์ด "Just like this"๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ์—๋งŒ StandardOutput์„ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” Minecraft ์ž์ฒด์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์— ๊ทน๋„์˜ ๊ฒŒ์œผ๋ฆ„์„ ํ”ผ์šฐ๊ธฐ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰ ์ค‘์— ์‹คํ–‰ ์ธ์ˆ˜๋ฅผ ์ˆ˜์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์‹  ๋ฒ„์ „์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„์กฐํ•˜๋‹ค.

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

sort-object๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๊ธฐ์— ๋ช‡ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋„ฃ์—ˆ๋Š”์ง€์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ๊ฐ€์žฅ ํฐ ์ˆซ์ž๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์ธ ๊ฒŒ์œผ๋ฆ„.

์ด์ œ ์„œ๋ฒ„์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ๊ฐ€์ ธ์™€ ํ•ด๋‹น ์–‘์„ ๋ฌธ์ž์—ด๋กœ ์”๋‹ˆ๋‹ค.

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

์˜ฌ๋ฐ”๋ฅธ ์ž๋™ ์žฌ์‹œ์ž‘

์ž‘์„ฑ์ž๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ .bat ํŒŒ์ผ์„ ๋ณด์•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ์ค‘์ง€๋œ ์ด์œ ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ถˆํŽธํ•œ๋ฐ, ๊ทธ๋ƒฅ ๋ชจ๋“œ ํŒŒ์ผ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋ญ”๊ฐ€ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
์ด์ œ ์ œ๋Œ€๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž๋Š” ์ด์ „์— ์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋œ ์ด์œ ์— ๊ด€๊ณ„์—†์ด ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ์ด์ƒํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ข…๋ฃŒ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 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

์ด์ œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์‹œ์ž‘

์ž‘์„ฑ์ž๋Š” ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์˜ Minecraft๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํŠน์ • ํด๋”์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์‹œ์Šคํ…œ์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๋ฐ์Šคํฌํ†ฑ์ด๋‚˜ 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

๋ชจ๋“ˆ ์กฐ๋ฆฝ

์ด์ œ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋ชจ๋“ˆ์— ๋„ฃ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ์„ฑ ์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ชจ๋“ˆ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์œผ๋ ค๋ฉด ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘-๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ

๋จผ์ € ํ‘œ์ค€ ์ถœ๋ ฅ์„ ๋“ฃ๊ณ  ๊ธฐ๋กํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ธ”๋ก์—์„œ ๊ทธ๋Š” ์–ด๋Š ํด๋”์—์„œ Minecraft๋ฅผ ์‹œ์ž‘ํ• ์ง€, ์–ด๋””์— ๋กœ๊ทธ๋ฅผ ๋„ฃ์„์ง€ ๋ฌป์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด 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

๋“ฑ๋ก-๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ

์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒˆ ์ž‘์—…๋งŒ ๋“ฑ๋กํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด 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

๋“ฑ๋ก-์ž๋™ ๋กœ๊ทธ์˜จ

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ธ”๋ก์—์„œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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"

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์ด์ œ ์ €์ž๊ฐ€ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Windows์—์„œ ๊ณต์šฉ Minecraft ์„œ๋ฒ„๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•. ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€