2012-06-08 46 views
1

我的Minecraft服務器往往相當頻繁死機,所以我寫了一個腳本來檢查我的Minecraft服務器,如果達到它什麼都不做,如果是向下它執行此代碼:VBS shell.run打破

Set oShell= CreateObject("WScript.Shell") 
strProcess = "cmd.exe" 
oShell.Run "TaskKill /im " & strProcess & " /f /t", , True 
WScript.sleep 1000 
oShell.Run "c:\minecraft_launch.bat" 
Set oShell = Nothing 

基本上我殺了任何當前正在運行的服務器(cmd,因爲它正在從批處理文件運行),然後我開始備份。此檢查每5分鐘通過任務計劃程序運行。

這是批處理文件的內容:

@echo off 
"C:\Program Files\Java\jre6\bin\java.exe" -Xmx1024M -Xms1024M -jar "%appdata%\- minecraft_server\minecraft_server.jar" >> "%appdata%\- minecraft_server\s.log" 

當我運行它,它的工作原理。每次,但是.....當它自動運行時,它停止工作。我不知道在它退出之前它會工作多少次。會發生什麼事情,我注意到它已關閉,所以我檢查了我的電腦。沒有服務器正在運行,沒有進程正在運行,沒有運行javaw.exe或cmd.exe。沒有,但是當我嘗試啓動服務器時,它不會啓動。我必須重啓整臺機器才能啓動服務器。我想我在這裏錯過了一些愚蠢的東西。有任何想法嗎?

回答

2

問題可能是因爲超時時間太短,所以嘗試在關閉時啓動它。無論如何,vbscript本身可以通過更多的控制來檢查和終止進程。有關監視和停止進程的簡短腳本,請參見http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/processes/。 這裏羅布範德woude通常是可靠的腳本,這個監測OUTLOOK.EXE所以我想你會被監控的javaw.exe

KillProc "outlook.exe" 

Sub KillProc(myProcess) 
'Authors: Denis St-Pierre and Rob van der Woude 
'Purpose: Kills a process and waits until it is truly dead 

    Dim blnRunning, colProcesses, objProcess 
    blnRunning = False 

    Set colProcesses = GetObject(_ 
         "winmgmts:{impersonationLevel=impersonate}" _ 
         ).ExecQuery("Select * From Win32_Process", , 48) 
    For Each objProcess in colProcesses 
     If LCase(myProcess) = LCase(objProcess.Name) Then 
      ' Confirm that the process was actually running 
      blnRunning = True 
      ' Get exact case for the actual process name 
      myProcess = objProcess.Name 
      ' Kill all instances of the process 
      objProcess.Terminate() 
     End If 
    Next 

    If blnRunning Then 
     ' Wait and make sure the process is terminated. 
     ' Routine written by Denis St-Pierre. 
     Do Until Not blnRunning 
      Set colProcesses = GetObject(_ 
           "winmgmts:{impersonationLevel=impersonate}" _ 
           ).ExecQuery("Select * From Win32_Process Where Name = '" _ 
          & myProcess & "'") 
      WScript.Sleep 100 'Wait for 100 MilliSeconds 
      If colProcesses.Count = 0 Then 'If no more processes are running, exit loop 
       blnRunning = False 
      End If 
     Loop 
     ' Display a message 
     WScript.Echo myProcess & " was terminated" 
    Else 
     WScript.Echo "Process """ & myProcess & """ not found" 
    End If 
End Sub 
+0

你說的很對,我會嘗試了這一點。謝謝! – Andrew