1

私のMinecraftサーバーはかなり頻繁にクラッシュする傾向があるので、私のMinecraftサーバーをチェックするスクリプトを書きました。

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 も実行されていません。何もありませんが、サーバーを起動しようとしても起動しません。サーバーを起動するには、マシン全体を再起動する必要があります。ここでばかげた単純なものが欠けていると思います。何か案は?

4

1 に答える 1

2

問題は、タイムアウトが短すぎるため、まだ閉じている間に開始しようとしている可能性があります。いずれにせよ、vbscript 自体は、プロセスをより制御してチェックおよび終了できます。プロセスを監視および停止する短いスクリプトについては、 http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/processes/を参照してください。これは、通常信頼できるRob Van der 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
于 2012-06-09T09:58:58.580 に答える