2017-03-21 16 views
2

サーバーを起動するサードパーティの.batファイル(wso2server.bat)があります。Javaからバッチファイルから開始されたキルプロセス

私は)私がprocess.isAlive(この

process.destroy(); 
and 
process.destroyForcibly(); 

を止めようとした

Process process = Runtime.getRuntime.exec(cmd /C start cmd /C C:\wso\wso2esb-4.9.0\bin\wso2server.bat); 

ことによってそれを始めて破壊した後に "偽" を返します。しかし、まだ実行中のサーバー!

私も

ProcessBuilder pb = new ProcessBuilder(params); 
process = pb.start(); 

で実行し、それを止めようとしたが、私はそれを起動するか、java.exeが問題ではない - とサーバ - まだ実行されていると私はそれを止めることはできません。 これは.batが別のプロセスを開始するためだと思います...

どうすればこのjava.exeを停止できますか?

+0

'Runtime.getRuntime()。exec(" cmd/c start C:\ wso \ wso2esb-4.9.0 \ bin \ wso2server.bat ");'またはおそらく 'Runtime.getRuntime()。exec(" cmd/c C:\ wso \ wso2esb-4.9.0 \ bin \ wso2server.bat ");'? – Compo

+0

cmd/c start:サーバーは起動しますが、停止できません(上記と同じです)。 ただし、cmd/cの場合、サーバーは起動しません。 java.exeはタスクマネージャに表示されますが、Httpサイトは使用できません。 – user2287094

+0

startこの場合、サーバへの命令ではなく、バッチファイルへの命令です。なぜ 'cmd/c file.bat'がサーバを起動しないのか分かりません。あなたのバットファイルの内容は何ですか? – Compo

答えて

1

startコマンドはプロセスの完了を待機しないため、バッチコマンドでサーバーを実行して終了するだけでサーバープロセスを制御することはできません。

start /wait ...コマンドを使用してバッチファイルを実行します。あなたは、プロセスツリーがtaskkill /pid N /t /fコマンドを使用して殺すために

cmd "start" 
    cmd "batch" 
     server 

のようなプロセスツリーを持つことになりますのでstart /waitは、処理完了を待ちます。

cmdプロセス

  • セットアップcmdタイトル
  • root_cmdへのルートのPIDを取得するには、ウィンドウのタイトルroot_cmd
  • PIDを抽出して、プロセスを見つけるプロセスリスト

  • を取得し、 %TEMP%/pid.txt

    に保存してください0

  • がサーバーcmd /c "title root_cmd & (for /f "tokens=2 delims=," %A in ('tasklist /v /fo csv ^| findstr root_cmd') do echo %~A>"%TEMP%/pid.txt") & start /wait "" cmd /c wso2server.bat"
  • を実行し、すべて一緒

    を組み合わせるサーバーset /p PID=<"%TEMP%/pid.txt" & call taskkill /pid %PID% /t /f

アップデートを殺します。 Java用

package com.example; 

import java.io.IOException; 
import java.lang.Runtime; 

public class Main { 
    public static void main (String args[]) { 
     try { 
      if (args.length < 1) { 
       System.out.println("Start server"); 
       Runtime.getRuntime().exec(new String[]{ "cmd", "/c", "start /wait \"launcher_cmd\" s.bat"}); 
      } else { 
       System.out.println("Stop server"); 
       Runtime.getRuntime().exec(new String[]{ "cmd", "/c", "taskkill /fi \"WINDOWTITLE eq launcher_cmd*\" /t /f"}); 
      } 
     } catch(IOException e) { 
      System.out.println(e); 
     } 
    } 
} 

何らかの理由for ...については予想通り、execによって実行echo ...>filenameコマンドが機能していません。どこでもルートプロセスは後にもなります終了し、我々はcmd /cを使用しているためcmd "title"プロセスを殺すとその子孫

  • ます
  • taskkill /fi "WINDOWTITLE eq launcher_cmd*" /t /f

    • start /wait "title" command意志のセットアップCMDのタイトルやバッチファイルを実行します。だから私は方法を変更しました子供が殺される
  • +0

    返事をありがとう。私はこのコマンドを試してみました:Runtime.getRuntime()。exec( "cmd/c" title root_cmd&(for/f \ "トークン= 2 delims =、\" A tasklist/v/fo csv^| findstr C:\\ wso \\ wso2esb-4.9.0 \\ bin \\ wso2server(root_cmd)を実行します。 .bat "); 残念ながら、2つのcmdウィンドウを起動しますが、サーバーは起動しません。画面を印刷します。https://ibb.co/mX9HWF – user2287094

    +0

    Javaの例を追加しました。 –

    +0

    ありがとうございます! – user2287094

    関連する問題