Müəllif oyunu çox sevir və özü də "sırf dostlar üçün" kiçik bir serverin administratorudur. Həvəskarlar arasında həmişə olduğu kimi, serverdəki hər şey dəyişdirilir və bu, işin qeyri-sabitliyinə və nəticədə düşməyə səbəb olur. Müəllif Powershell-i küçəsindəki mağazaların yerləşdiyi yerdən daha yaxşı bildiyi üçün bunu etmək qərarına gəldi "Minecraft 2020-ni işə salmaq üçün ən yaxşı skript". Eyni skript şablon üçün əsas kimi xidmət etdi
Bizə lazım olan əmrlər
Alternativ giriş
Daha bir neçə mod quraşdırdıqdan sonra gördüm ki, server, görünür, müharibə elan etmədən çökür. Server ən son.log və ya debug-a səhvlər yazmadı və nəzəri olaraq bu xətanı yazıb dayandırmalı olan konsol bağlandı.
Yazmaq istəmirsinizsə, yazmayın. Bizdə cmdlet ilə Powershell var Tee-Obyekt, hansı obyekti götürür və eyni zamanda fayla və konsola çıxarır.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Beləliklə, Powershell StandardOutput-u götürəcək və onu fayla yazacaq. İstifadə etməyə çalışmayın Başlanğıc-Prosesə, çünki o, StandardOutput deyil, System.ComponentModel.Component qaytaracaq və -RedirectStandardOutput konsola yazmağı qeyri-mümkün edəcək, bundan qaçmaq istəyirik.
Arqumentləri işə salın
Eyni cüt modları quraşdırdıqdan sonra müəllif serverdə də kifayət qədər RAM olmadığını gördü. Və işə salınma arqumentlərini dəyişdirmək lazımdır. Hər kəsin istifadə etdiyi start.bat-da onları hər dəfə dəyişmək əvəzinə, sadəcə bu skriptdən istifadə edin.
Tee-Object StandardOutput-u yalnız icra olunan sənəd "Eynən belə" adlandırıldıqda oxuduğu üçün daha bir skript yerinə yetirilməli olacaq. Bu skript Minecraft-ı özü işlədəcək. Arqumentlərdən başlayaq.
Gələcəkdə son tənbəlliyə qapılmaq üçün skript tez bir zamanda başlanğıc arqumentlərini toplamalıdır. Bunun üçün ən son versiyanı axtararaq başlayaq döymək.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Sort-obyekt ilə, oraya nə qədər qoymağınızdan asılı olmayaraq, biz həmişə ən çox sayda obyekti götürəcəyik. Son tənbəllik.
İndi serverə yaddaş təyin etməliyik. Bunun üçün sistem yaddaşının həcmini götürüb onun miqdarını sətirə yazırıq.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Düzgün avtomatik yenidən başladın
Müəllif digər insanların .bat fayllarını görüb, lakin serverin dayandırılmasının səbəbini nəzərə almadılar. Əlverişsizdir, sadəcə mod faylını dəyişdirmək və ya bir şeyi silmək lazımdırsa?
İndi düzgün yenidən başladın edək. Müəllif daha əvvəl serverin niyə çıxmasından asılı olmayaraq serveri yenidən işə salan qəribə skriptlərlə rastlaşmışdı. Çıxış kodundan istifadə edəcəyik. Java müvəffəqiyyət kimi 0-dan istifadə edir, gəlin oradan rəqs edək.
Əvvəlcə server uğursuz olarsa onu yenidən işə salacaq funksiya yaradaq.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Skript server /stop əmrindən istifadə edərək öz konsolundan normal şəkildə çıxana qədər dövrədə qalacaq.
Hər şeyi avtomatlaşdırmaq qərarına gəlsək, o zaman işə salınma tarixini, bitməsini, həmçinin sonun səbəbini toplamaq yaxşı olardı.
Bunun üçün Start-Process nəticəsini dəyişənə yazırıq. Bir skriptdə bu belə görünür:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
Və sonra nəticələri fayla yazın. Dəyişəndə bizə qaytarılan budur:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Bütün bunlar Add-Content istifadə edərək fayla əlavə edilə bilər. Bir az fırçaladıqdan sonra belə bir skript əldə edirik, lakin biz ona handler.ps1 deyirik.
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
İndi işləyicinin işə salınması ilə skripti dizayn edək.
Düzgün avtomatik yükləmə
Müəllif müxtəlif versiyaların Minecraft-ı bir modulla istənilən yoldan idarə etmək, həmçinin qeydləri müəyyən bir qovluğa yerləşdirmək istəyir.
Problem ondadır ki, proses daxil olmuş istifadəçi tərəfindən başlamalıdır. Bu, masaüstü və ya WinRm vasitəsilə edilə bilər. Əgər serveri sistem və ya hətta administrator kimi işlədirsinizsə, lakin daxil olmasanız, o zaman Server.jar hətta eula.txt faylını oxuya və başlaya bilməyəcək.
Reyestrə üç giriş əlavə etməklə avtoloqu aktivləşdirə bilərik.
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
Bu təhlükəsiz deyil. Giriş və parol burada açıq mətnlə göstərilir, buna görə də serveri işə salmaq üçün istifadəçi səviyyəsində və ya daha dar qrupda çıxışı olan ayrıca istifadəçi yaratmalısınız. Bunun üçün standart administratordan istifadə etmək qətiyyən tövsiyə edilmir.
Autologin-i anladıq. İndi server üçün yeni tapşırığı qeydiyyatdan keçirməlisiniz. Biz Powershell-dən əmr işlədəcəyik, buna görə də belə görünəcək:
$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
Modulun yığılması
İndi hər şeyi sonradan istifadə edilə bilən modullarda təşkil edək. Hazır skriptlərin bütün kodları buradadır, idxal və istifadə.
Modullarla narahat olmaq istəmirsinizsə, yuxarıda təsvir edilən hər şeyi ayrıca istifadə edə bilərsiniz.
minecrafta başlayın
Əvvəlcə standart çıxışa qulaq asacaq və yazacaq bir skript işlətməkdən başqa heç nə etməyəcək bir modul yaradaq.
Parametr blokunda o, Minecraft-ın hansı qovluqdan işə salınacağını və jurnalı hara qoyacağını soruşur.
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-ı belə idarə etməli olacaqsınız:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
İndi istifadəyə hazır Handler.ps1-ə keçək
Çağırılan zaman skriptimizin parametrləri qəbul etməsi üçün biz də parametr blokunu təyin etməliyik. Nəzərə alın ki, o, Oracle Java-da işləyir, əgər fərqli paylamadan istifadə edirsinizsə, icra olunan faylın yolunu dəyişməli olacaqsınız.
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 qeydiyyatdan keçin
Skript praktiki olaraq Start-Minecraft ilə eynidir, yalnız yeni tapşırığı qeyd etməsi istisna olmaqla. Eyni arqumentləri qəbul edir. İstifadəçi adı, müəyyən edilmədikdə, cari adı götürür.
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
Qeydiyyat - Avtoloq
Parametr blokunda skript İstifadəçi adı və Parol parametrlərini qəbul edir. İstifadəçi adı göstərilməyibsə, cari istifadəçinin adı istifadə olunur.
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."
}
Bu skripti işə salmaq belə görünür:
Set-Autologon -Password "PlaintextPassword"
Necə istifadə
İndi müəllifin özünün bütün bunlardan necə istifadə etdiyinə fikir verin. Minecraft ictimai serverini Windows-da necə düzgün yerləşdirmək olar. Ən başdan başlayaq.
1. İstifadəçi yaradın
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Skripti işə salmaq üçün tapşırığı qeydiyyatdan keçirin
Belə bir modulla qeydiyyatdan keçə bilərsiniz:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
Və ya standart vasitələrdən istifadə edin:
$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. Autologin-i yandırın və maşını yenidən başladın
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
Tamamlama
Müəllif ssenarini, o cümlədən özü üçün hazırladı, buna görə də ssenarinin təkmilləşdirilməsi üçün təkliflərinizi dinləməkdən məmnun olacaq. Müəllif ümid edir ki, bütün bu kodlar sizin üçün ən azı minimal faydalı olub və məqalə maraqlıdır.
Mənbə: www.habr.com