කතුවරයා ක්රීඩාවට බෙහෙවින් ප්රිය කරන අතර, ඔහුම කුඩා සේවාදායකයක පරිපාලක වේ "හුදෙක් මිතුරන් සඳහා." ආධුනිකයන් අතර සුපුරුදු පරිදි, සේවාදායකයේ ඇති සෑම දෙයක්ම නවීකරණය කර ඇති අතර, මෙය අස්ථාවරත්වයට හේතු වන අතර, එහි ප්රතිඵලයක් වශයෙන්, බිඳ වැටේ. පවර්ෂෙල් හි කතුවරයා ඔහුගේ වීදියේ වෙළඳසැල් ඇති ස්ථානයට වඩා හොඳින් දන්නා බැවින්, ඔහු එය සෑදීමට තීරණය කළේය.Minecraft 2020 දියත් කිරීමට හොඳම පිටපත" තුළ සැකිල්ල සඳහා පදනම ලෙස එකම පිටපත ක්රියා කළේය
අපට අවශ්ය විධාන
විකල්ප ලොග් කිරීම
දිනක්, තවත් මෝඩ් කිහිපයක් ස්ථාපනය කිරීමෙන් පසු, සර්වරය යුද්ධය ප්රකාශ නොකර බිඳ වැටෙන බව මම සොයා ගතිමි. සේවාදායකයා latest.log හෝ debug හි දෝෂ ලියා නැති අතර, න්යායාත්මකව මෙම දෝෂය ලියා නතර කළ යුතු කොන්සෝලය වසා ඇත.
ඔහු ලිවීමට අවශ්ය නැති නම්, ඔහුට අවශ්ය නොවේ. අපි පවර්ෂෙල් සමඟ cmdlet ඇත ටී-වස්තුව, එය වස්තුවක් ගෙන එය ගොනුවකට සහ කොන්සෝලය වෙත එකවර ප්රතිදානය කරයි.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
මේ ආකාරයට, Powershell විසින් StandardOutput ලබාගෙන එය ගොනුවකට ලියනවා. භාවිතා කිරීමට උත්සාහ නොකරන්න ආරම්භය-ක්රියාවලියමක්නිසාද යත් එය System.ComponentModel.Component ආපසු ලබා දෙන අතර සම්මත ප්රතිදානය නොවේ, සහ -RedirectStandardOutput මඟින් කොන්සෝලයට ඇතුළු වීමට නොහැකි වනු ඇත, එය අපට වළක්වා ගැනීමට අවශ්ය වේ.
තර්ක දියත් කරන්න
එම මෝඩ් යුගලය ස්ථාපනය කිරීමෙන් පසුව, සේවාදායකයේ ප්රමාණවත් RAM එකක් නොමැති බව කතුවරයා දුටුවේය. තවද මෙය දියත් කිරීමේ තර්ක වෙනස් කිරීම අවශ්ය වේ. හැමෝම භාවිතා කරන start.bat හි සෑම විටම ඒවා වෙනස් කිරීම වෙනුවට, මෙම script එක භාවිතා කරන්න.
Tee-Object කියවනුයේ StandardOutput පමණක් ක්රියාත්මක කළ හැකි "Just Like This" ලෙස හැඳින්වූ විට, ඔබට වෙනත් ස්ක්රිප්ට් එකක් සෑදීමට සිදුවේ. මෙම පිටපත 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 ගොනු දැක ඇත, නමුත් සේවාදායකය නතර කිරීමට හේතුව ඔවුන් ගණන් ගත්තේ නැත. මෙය අපහසුයි, ඔබට මොඩ් ගොනුව වෙනස් කිරීමට හෝ යමක් මකා දැමීමට අවශ්ය නම් කුමක් කළ යුතුද?
දැන් අපි නිසි ලෙස නැවත ආරම්භ කරමු. සේවාදායකය වසා දැමුවේ ඇයිද යන්න නොසලකා සේවාදායකය නැවත ආරම්භ කළ අමුතු ස්ක්රිප්ට් කතුවරයාට මීට පෙර හමු විය. අපි exitcode භාවිතා කරන්නෙමු. ජාවා සාර්ථක ලෙස 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
පළමුව, සම්මත ප්රතිදානයට සවන් දෙන සහ වාර්තා කරන ස්ක්රිප්ට් එකක් ධාවනය කිරීමට වඩා වැඩි දෙයක් නොකරන මොඩියුලයක් නිර්මාණය කරමු.
පරාමිති බ්ලොක් එකේ, 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
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
රෙජිස්ටර්-ස්වයංක්රීය
පරාමිති බ්ලොක් එකේ, ස්ක්රිප්ට් පරිශීලක නාමය සහ මුරපද පරාමිතීන් පිළිගනී. පරිශීලක නාමය සඳහන් කර නොමැති නම්, වත්මන් පරිශීලකයාගේ නම භාවිතා වේ.
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 සේවාදායකයක් නිසි ලෙස යොදවන්නේ කෙසේද. අපි මුල සිටම පටන් ගනිමු.
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"
සම්පූර්ණ කිරීම
කතුවරයා තමා ඇතුළුව පිටපත සාදා ඇත, එබැවින් පිටපත වැඩිදියුණු කිරීම සඳහා ඔබේ යෝජනා වලට සවන් දීමට ඔහු සතුටු වනු ඇත. මෙම සියලු කේතය ඔබට අවම වශයෙන් අවම වශයෙන් ප්රයෝජනවත් වූ බවත්, ලිපිය සිත්ගන්නාසුළු බවත් කතුවරයා බලාපොරොත්තු වේ.
මූලාශ්රය: www.habr.com