Guten Abend,
mir ist aufgefallen, dass mein Serverprogramm sich mit jedem verarbeiteten Befehl des Clients mehr Ram gönnt. Nach 1 Stunde lag die Nutzung bei ca 100mb. Wenn ich den Client gestoppt habe, ist die Nutzung nicht runter gegangen.
Gibt es eine Möglichkeit die RAM-Nutzung zu begrenzen, bzw. den RAM zu entleeren oder liegt der Fehler im Script?
Serverscript
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile_x64=starter.exe
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Constants.au3>
#include <File.au3>
#include <array.au3>
;... <Username> <ServerNo> <RAM> <Passwort>
[/autoit] [autoit][/autoit] [autoit]If $CmdLine[0] < 1 Then Exit
[/autoit] [autoit][/autoit] [autoit]$Process = Run("java -Dfile.encoding=utf-8 -Djline.terminal=jline.UnsupportedTerminal -server -Xmx" & $CmdLine[3] & "M -jar D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\minecraft_server.jar nogui -nojline", "D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
$ticker = TimerInit()
If $Process Then
WinSetTitle("starter.exe", "", $Process)
Else
Exit
EndIf
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc"), $f_COMError = False
[/autoit] [autoit][/autoit] [autoit]TCPStartup()
$asocket = TCPListen("176.57.141.178", 1)
$try = 0
While 1
Do
$acceptedSocket = TCPAccept($asocket)
Until $acceptedSocket <> -1
$waittimer = TimerInit()
Do
$receivedData = TCPRecv($acceptedSocket, 1024)
Until $receivedData <> "" Or TimerDiff($waittimer) > 60000
$authstring = $CmdLine[1] & "|;:|" & $CmdLine[4]
If $receivedData == $authstring And $try < 4 Then
TCPSend($acceptedSocket, "O.K.")
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Authentication from " & SocketToIP($acceptedSocket) & " successful!" & @CRLF)
Do
$receivedData = TCPRecv($acceptedSocket, 1024)
Until $receivedData <> "" Or TimerDiff($waittimer) > 60000
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Incoming Command: |" & $receivedData & "| from " & SocketToIP($acceptedSocket) & @CRLF)
If $receivedData == "multiple" Then
Do
$receivedData = TCPRecv($acceptedSocket, 1024)
If $receivedData == "list" Then
TCPSend($acceptedSocket, GetOnlinePlayer())
ElseIf $receivedData == "maxram" Then
TCPSend($acceptedSocket, $CmdLine[3])
ElseIf $receivedData == "useram" Then
$ramarr = ProcessGetStats($Process)
$ramarr = $ramarr[0] / 1024 / 1024
If StringInStr($ramarr, ".") Then $ramarr = StringTrimRight($ramarr, StringLen($ramarr) - StringInStr($ramarr, ".") + 1)
TCPSend($acceptedSocket, $ramarr)
ElseIf $receivedData == "usecpu" Then
$cpuarr = _ProcessListProperties($Process)
TCPSend($acceptedSocket, StringToBinary($cpuarr[1][6] / 10))
ElseIf $receivedData == "uptime" Then
TCPSend($acceptedSocket, GetServerUptime())
EndIf
Until $receivedData == "multipleend" Or TimerDiff($waittimer) > 60000 Or $receivedData == "quit"
If $receivedData == "quit" Or $receivedData == "multipleend" Then ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Connection to " & SocketToIP($acceptedSocket) & " has been reset!" & @CRLF)
If TimerDiff($waittimer) > 60000 Then ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Lost connection to " & SocketToIP($acceptedSocket) & @CRLF)
Else
If $receivedData == "list" Then
TCPSend($acceptedSocket, GetOnlinePlayer())
ElseIf $receivedData == "uptime" Then
TCPSend($acceptedSocket, GetServerUptime())
ElseIf $receivedData == "getserverlog" Then
$logfile = FileOpen("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log",0)
If $logfile == -1 Then
TCPSend($acceptedSocket,"-1")
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Failed to open Logfile!" & @CRLF)
Else
$rline = ""
If _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log") > 50 Then
$i = _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log") - 49
Else
$i = 1
EndIf
Do
$lnread = FileReadLine($logfile,$i)
If IsString($lnread) Then
$rline &= $lnread&@CRLF
$i = $i+1
Else
$i = _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log")+1
EndIf
Until $i = _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log")+1
TCPSend($acceptedSocket, $rline)
FileClose($logfile)
$rline = ""
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Connection to " & SocketToIP($acceptedSocket) & " has been reset!" & @CRLF)
EndIf
ElseIf TimerDiff($waittimer) > 60000 Then
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Lost connection to " & SocketToIP($acceptedSocket) & @CRLF)
ElseIf $receivedData == "quit" Then
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Connection to " & SocketToIP($acceptedSocket) & " has been reset!" & @CRLF)
Else
StdinWrite($Process, $receivedData & @CRLF)
EndIf
EndIf
TCPCloseSocket($acceptedSocket)
$try = 0
ElseIf $receivedData == "quit"
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Connection to " & SocketToIP($acceptedSocket) & " has been reset!" & @CRLF)
TCPCloseSocket($acceptedSocket)
Else
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Authentication failed from " & SocketToIP($acceptedSocket) & @CRLF)
TCPSend($acceptedSocket, "Wrong password or username!")
TCPCloseSocket($acceptedSocket)
$try = $try + 1
If $try > 3 Then
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Too many failed authentications! Sleeping 2 min." & @CRLF)
TCPCloseSocket($asocket)
Sleep(120000)
$try = 0
$asocket = TCPListen("176.57.141.178", 1)
ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Listening..." & @CRLF)
EndIf
EndIf
WEnd
TCPShutdown()
Exit
Func GetOnlinePlayer()
StdinWrite($Process, "list" & @CRLF)
$logfile = FileOpen("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log", 0)
If $logfile == -1 Then
FileClose($logfile)
Return "0/0"
Else
$atime = TimerInit()
Do
$text = FileReadLine($logfile, _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log") - 1)
Until StringInStr($text, "There are ") <> 0 Or StringInStr($text, "Es sind ") <> 0 Or TimerDiff($atime) > 10000
If StringInStr($text, "/INFO") == 0 Then
$pos = StringInStr($text, "/")
Else
$pos = StringInStr($text, "/", 0, 2)
EndIf
$pos1 = StringInStr($text, " ", 0, 5)
$pos2 = StringInStr($text, " ", 0, 6)
$player = StringTrimRight($text, StringLen($text) - $pos2)
$player = StringTrimLeft($player, $pos1)
FileClose($logfile)
$test = ""
Return $player
EndIf
EndFunc
Func GetServerUptime()
$zeit = TimerDiff($ticker) / 1000
If StringInStr($zeit, ".") > 0 Then $zeit = StringTrimRight($zeit, StringLen($zeit) - StringInStr($zeit, ".") + 1)
If $zeit < 60 Then
$sec = $zeit
$min = "0"
$std = "0"
$day = "0"
ElseIf $zeit < 60 * 60 Then
If StringInStr($zeit / 60, ".") == 0 Then
$sec = "0"
$min = $zeit / 60
Else
$min = $zeit / 60
If StringInStr($min, ".") > 0 Then $min = StringTrimRight($min, StringLen($min) - StringInStr($min, ".") + 1)
$sec = $zeit - $min * 60
If StringInStr($sec, ".") > 0 Then $sec = StringTrimRight($sec, StringLen($sec) - StringInStr($sec, ".") + 1)
EndIf
$std = "0"
$day = "0"
ElseIf $zeit < 60 * 60 * 24 Then
If StringInStr($zeit / 60 / 60, ".") == 0 Then
$sec = "0"
$min = "0"
$std = $zeit / 60 / 60
Else
$std = $zeit / 60 / 60
If StringInStr($std, ".") > 0 Then $std = StringTrimRight($std, StringLen($std) - StringInStr($std, ".") + 1)
$min = $zeit / 60 - $std * 60
If StringInStr($min, ".") > 0 Then $min = StringTrimRight($min, StringLen($min) - StringInStr($min, ".") + 1)
$sec = $zeit - $std * 60 * 60 - $min * 60
If StringInStr($sec, ".") > 0 Then $sec = StringTrimRight($sec, StringLen($sec) - StringInStr($sec, ".") + 1)
EndIf
$day = "0"
Else
If StringInStr($zeit / 60 / 60 / 24, ".") == 0 Then
$sec = "0"
$min = "0"
$std = "0"
$day = $zeit / 60 / 60 / 24
Else
$day = StringTrimRight($zeit / 60 / 60 / 24, StringLen($zeit / 60 / 60 / 24) - StringInStr($zeit / 60 / 60 / 24, ".") + 1)
$std = $zeit / 60 / 60 - $day * 24
If StringInStr($std, ".") > 0 Then $std = StringTrimRight($std, StringLen($std) - StringInStr($std, ".") + 1)
$min = $zeit / 60 - $std * 60 - $day * 24 * 60
If StringInStr($min, ".") > 0 Then $min = StringTrimRight($min, StringLen($min) - StringInStr($min, ".") + 1)
$sec = $zeit - $std * 60 * 60 - $min * 60 - $day * 24 * 60 * 60
If StringInStr($sec, ".") > 0 Then $sec = StringTrimRight($sec, StringLen($sec) - StringInStr($sec, ".") + 1)
EndIf
EndIf
If $sec < 10 Then $sec = "0" & $sec
If $min < 10 Then $min = "0" & $min
If $std < 10 Then $std = "0" & $std
$ausgabe = $day & "d " & $std & ":" & $min & ":" & $sec
Return $ausgabe
$ausgabe = ""
$zeit = ""
EndFunc
Func SocketToIP($SHOCKET)
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
Return $aRet
EndFunc
Func _ProcessListProperties($Process = "", $sComputer = ".")
Local $sUserName, $sMsg, $sUserDomain, $avProcs, $dtmDate
Local $avProcs[1][2] = [[0, ""]], $n = 1
; Convert PID if passed as string
If StringIsInt($Process) Then $Process = Int($Process)
; Connect to WMI and get process objects
$oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!" & $sComputer & "\root\cimv2")
If IsObj($oWMI) Then
; Get collection processes from Win32_Process
If $Process == "" Then
; Get all
$colProcs = $oWMI.ExecQuery("select * from win32_process")
ElseIf IsInt($Process) Then
; Get by PID
$colProcs = $oWMI.ExecQuery("select * from win32_process where ProcessId = " & $Process)
Else
; Get by Name
$colProcs = $oWMI.ExecQuery("select * from win32_process where Name = '" & $Process & "'")
EndIf
If IsObj($colProcs) Then
; Return for no matches
If $colProcs.count = 0 Then Return $avProcs
; Size the array
ReDim $avProcs[$colProcs.count + 1][10]
$avProcs[0][0] = UBound($avProcs) - 1
; For each process...
For $oProc In $colProcs
; [n][0] = Process name
$avProcs[$n][0] = $oProc.name
; [n][1] = Process PID
$avProcs[$n][1] = $oProc.ProcessId
; [n][2] = Parent PID
$avProcs[$n][2] = $oProc.ParentProcessId
; [n][3] = Owner
If $oProc.GetOwner($sUserName, $sUserDomain) = 0 Then $avProcs[$n][3] = $sUserDomain & "" & $sUserName
; [n][4] = Priority
$avProcs[$n][4] = $oProc.Priority
; [n][5] = Executable path
$avProcs[$n][5] = $oProc.ExecutablePath
; [n][8] = Creation date/time
$dtmDate = $oProc.CreationDate
If $dtmDate <> "" Then
; Back referencing RegExp pattern from weaponx
Local $sRegExpPatt = "\A(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?:.*)"
$dtmDate = StringRegExpReplace($dtmDate, $sRegExpPatt, "$2/$3/$1 $4:$5:$6")
EndIf
$avProcs[$n][8] = $dtmDate
; [n][9] = Command line string
$avProcs[$n][9] = $oProc.CommandLine
; increment index
$n += 1
Next
Else
SetError(2); Error getting process collection from WMI
EndIf
; release the collection object
$colProcs = 0
; Get collection of all processes from Win32_PerfFormattedData_PerfProc_Process
; Have to use an SWbemRefresher to pull the collection, or all Perf data will be zeros
Local $oRefresher = ObjCreate("WbemScripting.SWbemRefresher")
$colProcs = $oRefresher.AddEnum($oWMI, "Win32_PerfFormattedData_PerfProc_Process").objectSet
$oRefresher.Refresh
; Time delay before calling refresher
Local $iTime = TimerInit()
Do
Sleep(20)
Until TimerDiff($iTime) >= 100
$oRefresher.Refresh
; Get PerfProc data
For $oProc In $colProcs
; Find it in the array
For $n = 1 To $avProcs[0][0]
If $avProcs[$n][1] = $oProc.IDProcess Then
; [n][6] = CPU usage
$avProcs[$n][6] = $oProc.PercentProcessorTime
; [n][7] = memory usage
$avProcs[$n][7] = $oProc.WorkingSet
ExitLoop
EndIf
Next
Next
Else
SetError(1); Error connecting to WMI
EndIf
; Return array
Return $avProcs
EndFunc
Ich habe bereits große Strings nach der Verarbeitung entleer ($string = ""), hat aber nicht viel gebracht...
Hat jemand eine Lösung für das Problem?
Mit freundlichen Grüßen
Krassus