ஆசிரியர் விளையாட்டை மிகவும் விரும்புகிறார், மேலும் அவரே ஒரு சிறிய சேவையகத்தின் நிர்வாகி "முற்றிலும் நண்பர்களுக்காக." அமெச்சூர்களிடையே வழக்கம் போல், சேவையகத்தில் உள்ள அனைத்தும் மாற்றியமைக்கப்பட்டுள்ளன, மேலும் இது உறுதியற்ற தன்மையை ஏற்படுத்துகிறது மற்றும் இதன் விளைவாக செயலிழக்கிறது. பவர்ஷெல் ஆசிரியர் தனது தெருவில் உள்ள கடைகளின் இருப்பிடத்தை விட நன்றாக அறிந்திருப்பதால், அவர் "Minecraft 2020 ஐ தொடங்க சிறந்த ஸ்கிரிப்ட்" அதே ஸ்கிரிப்ட் டெம்ப்ளேட்டிற்கு அடிப்படையாக செயல்பட்டது
நமக்கு தேவையான கட்டளைகள்
மாற்று பதிவு
ஒரு நாள், இன்னும் இரண்டு மோட்களை நிறுவிய பிறகு, சர்வர், வெளிப்படையாக, போரை அறிவிக்காமல் செயலிழக்கச் செய்வதைக் கண்டுபிடித்தேன். சேவையகம் latest.log அல்லது பிழைத்திருத்தத்தில் பிழைகளை எழுதவில்லை, மேலும் கோட்பாட்டளவில் இந்தப் பிழையை எழுதி நிறுத்தியிருக்க வேண்டிய கன்சோல் மூடப்பட்டது.
அவர் எழுத விரும்பவில்லை என்றால், அவர் தேவையில்லை. cmdlet உடன் Powershell உள்ளது டீ-பொருள், இது ஒரு பொருளை எடுத்து அதை ஒரு கோப்பிற்கும் கன்சோலுக்கும் ஒரே நேரத்தில் வெளியிடுகிறது.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
இந்த வழியில், பவர்ஷெல் ஸ்டாண்டர்ட் அவுட்புட்டை எடுத்து ஒரு கோப்பில் எழுதும். பயன்படுத்த முயற்சிக்காதீர்கள் தொடக்க-செயல்முறைஏனெனில் இது System.ComponentModel.Component ஐ வழங்கும் ஆனால் StandardOutput அல்ல, மேலும் -RedirectStandardOutput கன்சோலுக்குள் நுழைவதை சாத்தியமற்றதாக்கும், இதைத்தான் நாம் தவிர்க்க விரும்புகிறோம்.
வாதங்களைத் தொடங்கவும்
அதே ஜோடி மோட்களை நிறுவிய பிறகு, சர்வரில் போதுமான ரேம் இல்லை என்பதை ஆசிரியர் கவனித்தார். இதற்கு வெளியீட்டு வாதங்களை மாற்ற வேண்டும். எல்லோரும் பயன்படுத்தும் start.bat இல் ஒவ்வொரு முறையும் அவற்றை மாற்றுவதற்குப் பதிலாக, இந்த ஸ்கிரிப்டைப் பயன்படுத்தவும்.
டீ-ஆப்ஜெக்ட் ஸ்டாண்டர்ட் அவுட்புட்டை மட்டுமே படிக்கும் என்பதால், எக்ஸிகியூட்டபிள் "ஜஸ்ட் லைக் திஸ்" என்று அழைக்கப்படும், நீங்கள் மற்றொரு ஸ்கிரிப்டை உருவாக்க வேண்டும். இந்த ஸ்கிரிப்ட் 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 கோப்புகளைப் பார்த்துள்ளார், ஆனால் சர்வர் நிறுத்தப்பட்டதற்கான காரணத்தை அவர்கள் கணக்கில் எடுத்துக்கொள்ளவில்லை. இது சிரமமாக உள்ளது, நீங்கள் மோட் கோப்பை மாற்ற வேண்டும் அல்லது எதையாவது நீக்க வேண்டும் என்றால் என்ன செய்வது?
இப்போது சரியான மறுதொடக்கம் செய்வோம். சர்வர் ஏன் மூடப்பட்டது என்பதைப் பொருட்படுத்தாமல் சேவையகத்தை மறுதொடக்கம் செய்யும் விசித்திரமான ஸ்கிரிப்ட்களை ஆசிரியர் முன்பு கண்டார். வெளியேறும் குறியீட்டைப் பயன்படுத்துவோம். ஜாவா வெற்றியாக 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 கட்டளையைப் பயன்படுத்தி அதன் சொந்த கன்சோலில் இருந்து சர்வர் பொதுவாக மூடப்படும் வரை ஸ்கிரிப்ட் லூப்பில் இருக்கும்.
எல்லாவற்றையும் தானியக்கமாக்க முடிவு செய்தால், தொடக்க தேதி, நிறைவு தேதி மற்றும் முடிவதற்கான காரணத்தையும் சேகரிப்பது நன்றாக இருக்கும்.
இதைச் செய்ய, தொடக்கச் செயல்முறையின் முடிவை ஒரு மாறியில் எழுதுகிறோம். ஸ்கிரிப்ட்டில் இது போல் தெரிகிறது:
$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
இது பாதுகாப்பானது அல்ல. உள்நுழைவு மற்றும் கடவுச்சொல் இங்கே எளிய உரையில் சுட்டிக்காட்டப்பட்டுள்ளன, எனவே சேவையகத்தைத் தொடங்க, பயனர் மட்டத்தில் அல்லது இன்னும் குறுகிய குழுவில் அணுகலைக் கொண்ட ஒரு தனி பயனரை நீங்கள் உருவாக்க வேண்டும். இதற்கு ஒரு நிலையான நிர்வாகியைப் பயன்படுத்த கண்டிப்பாக பரிந்துரைக்கப்படவில்லை.
தானாக உள்நுழைவதை நாங்கள் வரிசைப்படுத்தினோம். இப்போது நீங்கள் சேவையகத்திற்கான புதிய பணியை பதிவு செய்ய வேண்டும். பவர்ஷெல்லிலிருந்து கட்டளையை இயக்குவோம், எனவே இது இப்படி இருக்கும்:
$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 க்கு செல்லலாம்
எங்கள் ஸ்கிரிப்ட் அழைக்கப்படும் போது அளவுருக்களை ஏற்க, நாம் ஒரு அளவுரு தொகுதியையும் குறிப்பிட வேண்டும். தயவுசெய்து கவனிக்கவும், இது ஆரக்கிள் ஜாவாவை இயக்குகிறது, நீங்கள் வேறு விநியோகத்தைப் பயன்படுத்தினால், நீங்கள் இயங்கக்கூடிய கோப்பிற்கான பாதையை மாற்ற வேண்டும்.
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 சேவையகத்தை எவ்வாறு சரியாக வரிசைப்படுத்துவது. ஆரம்பத்திலிருந்தே ஆரம்பிப்போம்.
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