Հեղինակը շատ է սիրում խաղը, և նա ինքն է փոքր սերվերի ադմինիստրատորը «զուտ ընկերների համար»: Ինչպես սովորական է սիրողականների շրջանում, սերվերի վրա ամեն ինչ փոփոխված է, և դա հանգեցնում է անկայունության և, որպես հետևանք, խափանումների: Քանի որ Powershell-ի հեղինակն ավելի լավ գիտի, քան իր փողոցի խանութների գտնվելու վայրը, նա որոշեց կատարել «Minecraft 2020-ը գործարկելու լավագույն սցենարը« Նույն սցենարը հիմք է ծառայել կաղապարի համար
Մեզ անհրաժեշտ հրամանները
Այլընտրանքային անտառահատումներ
Մի օր, ևս մի քանի ռեժիմ տեղադրելուց հետո, ես հայտնաբերեցի, որ սերվերը, ըստ երևույթին, խափանում է առանց պատերազմ հայտարարելու: Սերվերը չի գրել սխալներ last.log-ում կամ debug-ում, և կոնսոլը, որը տեսականորեն պետք է գրեր այս սխալը և դադարեցվեր, փակվեց:
Եթե նա չի ուզում գրել, պետք չէ: Մենք ունենք Powershell cmdlet-ով Tee-Object, որը վերցնում է օբյեկտը և միաժամանակ դուրս բերում ֆայլ և կոնսոլ:
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Այս կերպ Powershell-ը կվերցնի StandardOutput-ը և կգրի այն ֆայլում: Մի փորձեք օգտագործել Սկսել-Գործընթացքանի որ այն կվերադարձնի System.ComponentModel.Component-ը և ոչ թե StandardOutput-ը, իսկ -RedirectStandardOutput-ն անհնարին կդարձնի մուտքը վահանակ, ինչից մենք ուզում ենք խուսափել:
Գործարկել փաստարկները
Այդ նույն զույգ մոդերը տեղադրելուց հետո հեղինակը նկատեց, որ սերվերը նույնպես բավարար RAM չունի։ Եվ սա պահանջում է մեկնարկի փաստարկների փոփոխություն: Փոխանակ ամեն անգամ դրանք փոխելու start.bat-ում, որն օգտագործում են բոլորը, պարզապես օգտագործեք այս սցենարը:
Քանի որ Tee-Object-ը կարդում է StandardOutput միայն այն դեպքում, երբ գործարկվողը կոչվում է «Just Like This», դուք ստիպված կլինեք ստեղծել մեկ այլ սցենար: Այս սցենարը կգործարկվի հենց Minecraft-ի կողմից: Սկսենք փաստարկներից։
Ապագայում վերջնական ծուլությանը անձնատուր լինելու համար սցենարը պետք է անմիջապես հավաքի մեկնարկային փաստարկներ: Դա անելու համար եկեք սկսենք որոնել վերջին տարբերակը կեղծել.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Օգտագործելով տեսակավորում-օբյեկտը, մենք միշտ կվերցնենք ամենամեծ թվով օբյեկտը, անկախ նրանից, թե դրանցից քանիսն եք այնտեղ դնում: Վերջնական ծուլություն.
Այժմ դուք պետք է հիշողություն հատկացնեք սերվերին: Դա անելու համար վերցրեք համակարգի հիշողության քանակը և դրա քանակը գրեք տողերով:
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Ճիշտ ավտոմատ վերագործարկում
Հեղինակը տեսել է .bat ֆայլեր այլ մարդկանցից, սակայն նրանք հաշվի չեն առել սերվերի դադարեցման պատճառը։ Սա անհարմար է, իսկ եթե պարզապես անհրաժեշտ է փոխել mod ֆայլը կամ ջնջել ինչ-որ բան:
Հիմա եկեք կատարենք պատշաճ վերագործարկում: Հեղինակը նախկինում հանդիպել է տարօրինակ սկրիպտների, որոնք վերագործարկում են սերվերը՝ անկախ նրանից, թե ինչու է սերվերը անջատվել: Մենք կօգտագործենք ելքի կոդը: 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-ը:
Ճիշտ գործարկում
Հեղինակը ցանկանում է գործարկել 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
Մոդուլի հավաքում
Այժմ եկեք ամեն ինչ դնենք մոդուլների մեջ, որոնք հետագայում կարող են օգտագործվել: Պատրաստի սկրիպտների ամբողջ կոդը այստեղ է, ներմուծեք և օգտագործեք։
Դուք կարող եք օգտագործել այն ամենը, ինչ վերը նկարագրված է առանձին, եթե չեք ցանկանում անհանգստանալ մոդուլների հետ:
Start-Minecraft
Նախ, եկեք ստեղծենք մի մոդուլ, որն այլևս չի անի, քան գործարկել սկրիպտը, որը կլսի և կգրանցի ստանդարտ արդյունքը:
Պարամետրերի բլոկում նա հարցնում է, թե որ թղթապանակից գործարկել 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
Գրանցվել-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
Գրանցում-Ավտոլոգոն
Պարամետրերի բլոկում սկրիպտը ընդունում է Օգտագործողի անուն և գաղտնաբառ պարամետրերը: Եթե օգտագործողի անունը նշված չէ, ապա օգտագործվում է ներկայիս օգտվողի անունը:
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"
Ավարտում
Հեղինակը կազմել է սցենարը, այդ թվում՝ իր համար, հետևաբար, սիրով կլսի սցենարը բարելավելու ձեր առաջարկները։ Հեղինակը հուսով է, որ այս ամբողջ ծածկագիրը գոնե նվազագույն չափով օգտակար էր ձեզ համար, և որ հոդվածը հետաքրքիր էր:
Source: www.habr.com