• ベストアンサー

Runtime#proccessのwait

//Batch part RunBatch(batchName); //sleep(1000); //B-part Systems.out.println("B-part"); --------------------------------------------------------- public void RunBatch(String BatchName)throws Exception {  Process pr = null;  Runtime runtime = Runtime.getRuntime();  pr = runtime.exec("cmd.exe /c start "+BatchName);  try {    int exitCode = pr.waitFor();    if(process != null) {      process.getErrorStream().close(); process.getInputStream().close(); process.getOutputStream().close(); process.destroy(); }  } catch (Exception e) {   e.printStackTrace();  } } このままですとバッチの処理が長い場合、処理が終了する前にB-partへ 処理が移行してしまいます。 とりあえずでwaitをかけてはいるのですが、完全にバッチ処理が終了 するまでB-partへ移行させない方法はありませんでしょうか? おそらくバッチファイルから結果出力させてJAVA側でフックするとは思うのですが、具体的にどう組めばいいのかが分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.5

残念ながら、SWTもOSネイティブな機能を使うのでだめなようです。 「通常のwindow」として、  Xemacs を利用すると旨くいったようなので、 もっと適切な方法もあるかと思いますが、お知らせします。 1.まず通常のwindowを開く。      Xemacsを起動する 2.そこから、バッチ処理を起動する。      Xemacsのメニューで、[Tools]-[Shell]-[Shell]を選択し      バッチコマンドを実行する。 3.バッチ処理終了後、windowを閉じる。      Xemacsを閉じる。 ここでようやくprocess.waitFor()が終了し、今まで抑止されていたB-partへ 移行するようです。 ------------------------------------------------------------------------ 秀丸等でも類似の機能があれがそれを使えばよいわけですが、今回試したXemacs のインストールは、 http://www.xemacs.org/Download/index.htmlのFor Windows 95, 98, NT, 2000, XP: You can get the current stable version of XEmacs InnoSetup install kit (Install Now!). から XEmacs_Setup_21.4.21.exe をダウンロードしました。 ------------------------------------------------------------------------ 作成したプログラムRuntime1.java ------------------------------------------------------------------------ public class Runtime1 { public static void main(String[] args) { // Batch part String batchLauncher = "\"C:\\Program Files\\XEmacs\\XEmacs-21.4.21\\i586-pc-win32\\xemacs.exe\""; try { runBatch(batchLauncher); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // sleep(1000); // B-part System.out.println("B-part"); } static void runBatch(String batchLauncher) throws Exception { Process process = null; Runtime runtime = Runtime.getRuntime(); process = runtime.exec(batchLauncher); try { process.waitFor(); if (process != null) { process.getErrorStream().close(); process.getInputStream().close(); process.getOutputStream().close(); process.destroy(); } } catch (Exception e) { e.printStackTrace(); } } } ------------------------------------------------------------------------ バッチ処理をしている間、Runtime1は通常のwindowのおかげで 止まっていると思います。 ----------------------- たか

forgedcode
質問者

お礼

auty様 返事送れて申し訳ございません ご回答ありがとうございました。 確かにちゃんとプロセスが終了するまで待機するようになりました。 とりあえずこの処理にて運用してみます。 これは私の我侭ですがサーバマシンにはあまり入れたくなかったので 別のアプローチ法も考えています。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • auty
  • ベストアンサー率58% (284/486)
回答No.6

ボタンを2つ並べて、順に実行するのはどうでしょう。 BatchLauncherjava --------------------------------------------------------------- import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; public class BatchLauncher extends JFrame { String path = "BATCHファイル名"; //   ここを変更! private static final long serialVersionUID = 1L; public BatchLauncher() { setTitle("BatchLauncher"); setSize(200, 120); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.getContentPane().setLayout(new FlowLayout()); JButton execBAT = new JButton("BATの実行"); execBAT.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onclick(); } }); this.getContentPane().add(execBAT); JButton execHello = new JButton("Helloの実行"); execHello.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onclickHello(); } }); this.getContentPane().add(execHello); setVisible(true); } public BatchLauncher(String path) { this(); this.path=path; } public void onclick() { ProcessBuilder builder = new ProcessBuilder(path); try { Process process = builder.start(); } catch (IOException e) { e.printStackTrace(); JOptionPane.showMessageDialog(this.getContentPane(), "プロセス ERROR"); } } public void onclickHello() { System.out.println("HELLO"); } public static void main(String args[]) { new BatchLauncher(); } } ---------------------------------------------------------------

全文を見る
すると、全ての回答が全文表示されます。
  • auty
  • ベストアンサー率58% (284/486)
回答No.4

>通常のwindowを開くとはcmd.exeのことでしょうか? コマンドプロンプト以外のwindowということです。 たぶん SWTのGUIで、Program.launch(...)というのがあったと思います。 残念ながら、これでcmd.exeが起動できるか確認していません。 現在時間がなくて申し訳ありませんが、確認しだいお知らせします。

全文を見る
すると、全ての回答が全文表示されます。
  • yuji
  • ベストアンサー率37% (64/169)
回答No.3

pr = runtime.exec("cmd.exe /c start "+BatchName); のstartをつけると、すぐ処理が抜けてしまいそうな気がするのですが どうでしょうか? pr = runtime.exec("cmd.exe /c "+BatchName); としてみてはどうでしょうか?

forgedcode
質問者

補足

回答ありがとうございます。 ご指摘の通りやってみたのですが、runtime.execから反応が返ってこなくなります。 startをつけることで起動させることができます。

全文を見る
すると、全ての回答が全文表示されます。
  • auty
  • ベストアンサー率58% (284/486)
回答No.2

JAVADOC(Process)に、 -------------------------------------------------------------------------------------  プロセスを作成するこれらのメソッドは、特定のネイティブなプラットフォーム上の特殊な  プロセスではうまく動作しない場合があります。たとえば、... Microsoft Windows 環境で  の Win16/DOS プロセス、... ------------------------------------------------------------------------------------- とあります。これが原因とは考えられないでしょうか。 とりあえず今思いつく方法としては、 1.まず通常のwindowを開く。 2.そこから、バッチ処理を起動する。 3.バッチ処理終了後、windowを閉じる。 では、どうでしょうか。 通常のwindowならば今の方法waitFor()で、うまくいくと思います。 老婆心ながら、提示されたソースにはエラーが多いようです。 ----------------------------- たか

forgedcode
質問者

補足

回答ありがとうございます。 windowを開くとはcmd.exeのことでしょうか? そうだとして、既に開いたcmdに対してどうコマンドを転送すればよいのか… エラーが多いのは掲載するにあたり、変数名などを縮めたのですが それが全部でなかったとかだと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

ふつうはwaitFor()をそのために使いますが、なにか使えない(役に立たない)状況はありますか?

forgedcode
質問者

補足

ご回答ありがとうございます。 A.bat----------- sqlplus -s ABC/ABC@DEF@C:\SQL.Command exit ---------------- SQL.Command----- set echo off set heading off set feedback off set verify off set linesize 1000 set pagesize 0 set trimspool on spool c:\Test.csv select COL1||','||COL2 from TEMP_CSV_DATA / spool off exit ----------- 以上のようにbatファイルからsqlplusのコマンドファイルを呼び出しています。 ためしにruntimeのほうで直接A.batの内容を実行したのですが 結果は同じでした。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Runtime クラスのexecメソッドについて

    javaで、Runtimeのexec()メソッドを使って、出てきた内容をJTextAreaに出力したいと思っています。つまり、JTextAreaをコマンドプロンプト風にしたいと思っています。しかし、exec()メソッドの戻り値である、Processクラスがいまいちよくわかりません。仕様書(日本語訳)を読んでもProcessクラスのgetInputStream()メソッドやgetOutputStream()メソッドの説明がいまいちピンときません。 try{ Process process = Runtime.getRuntime().exec("hogehoge"); /*---------------------------------------------------------*/ ここで、いかにしてJTextAreaに出力するのかわかりません /*---------------------------------------------------------*/ }catch(Exception e){ } どうか、わかる方よろしくお願いします。

    • ベストアンサー
    • Java
  • Runtime.execについての質問

    こんにちは、Makotoと申します。 Runtime.execを使って、ディレクトリを作成する プログラムを作っているのですが、下記のプログラムで ディレクトリは作成されるのですが、コマンドプロンプト画面が 立ち上がったままになってしまいます。閉じようと思い、8行目でexitコマンド を発行してみたのですが、うまくいきませんでした。このウィンドウを閉じる 方法はあるのでしょうか? 1:public class test{ 2:  public static void main(String[] args) throws Exception { 3:    Runtime rt = Runtime.getRuntime(); 4:    Process pr; 5:    try { 6:      Process proc1 = rt.exec("cmd /C start /MIN 7:               mkdir c:\\\poi\\test"); 8:      proc1 = rt.exec("command.com, /, exit"); 9:    } catch (java.io.IOException e) { 10:     System.err.println(e); 11:     System.exit(1); 12:    } 13: 14: } 15:}

    • ベストアンサー
    • Java
  • 外部コマンドの実行について

    ・Actionクラス public ActionForward Batch(     ActionMapping objActMapping,     ActionForm objActFrm,     HttpServletRequest objHttpRequest,     HttpServletResponse objHttpResponse)     throws Exception {         ActionForward objActFwd = null;         TestForm objTestForm = null;         try {             Runtime runtime = Runtime.getRuntime();             Process process = runtime.exec("c:/Batch/Batch.bat");             objActFwd = objActMapping.findForward("success");           }           catch (Exception e) {             e.printStackTrace();             throw e;           }         return objActFwd; } 以上のActionクラスをJSPからStrutusを介し実行しておりますが バッチファイルが実行されません。 batch.bat単体では実行可能です。 ご教授お願いいたします。 環境:WindowsXP j2sdk1.4.1 Jboss-3.2.3

    • ベストアンサー
    • Java
  • プログラムからの返答の意味がわかりません..

    import java.io.*; public class Teme { public static void main(String [] args) { String [] command = { "C:\\Users\\yuzumodoki\\Desktop\\chunkparser-1.0\\chunkparser-1.0\\parser.exe", "aaaa" }; // 外部プログラムを実行 Runtime runtime = Runtime.getRuntime(); Process process = null; try { process = runtime.exec(command); } catch(Exception exception) { System.err.println(exception.getMessage()); exception.printStackTrace(); System.exit(-1); } // 外部プログラムの標準出力から読み込み BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); System.out.println(br); try { String line; while((line = br.readLine()) != null) { System.out.println(line); } } catch(Exception exception) { System.err.println(exception.getMessage()); exception.printStackTrace(); System.exit(-1); } finally { try { br.close(); } catch(Exception exception) { System.err.println(exception.getMessage()); exception.printStackTrace(); System.exit(-1); } } } } 上記のプログラムはparser.exeにアクセスし,そのアプリケーションに文字列を送り,処理をしてその結果を取得するというものです. 本来"aaaa"と送ると"(aaaa aaaa)"と返ってくるプログラムなのですが, java.io.BufferedReader@89ae9e と返ってきます.これはなぜだかわかる方いらっしゃいますか?また,aaaa aaaaと本来の値を返すにはどうすればいいかわかる方いらっしゃいませんか.. もしわかる方いらっしゃたら教えて頂けたらすごくうれしいです(つj)

  • process has not exited

    実行可能なjarファイルをコマンド実行しその戻り値を取得したくて下記プログラムを書きました。 ところがprocess.exitValue() のところで  process has not exited というエラーを起こしてしまいます。原因はお分かりになりますでしょうか。 String command = "java -jar test.jar test; Process process = Runtime.getRuntime().exec(command); System.out.println("▼▼▼実行中のコマンド=" + command); //int no = process.waitFor(); //exec()が非同期実行であるため実行結果が返ってくるまで待つ System.out.println("▼▼▼コマンドの実行完了"); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; while ( (line = in.readLine())!=null ) { line = in.readLine(); System.out.println(line); } System.out.println("★★★コマンドの戻り値=" + process.exitValue()); if(process.exitValue() != 0) { process.destroy(); } in.close(); } } catch(Exception e) { if( process != null ) { process.destroy(); } e.printStackTrace(); }

    • ベストアンサー
    • Java
  • Javaプログラムから外部コマンドを呼び出す

    String com = "ls -l"; Process pro = Runtime.getRuntime().exec(com); 上記のようにして、外部コマンドを実行しています。 この方法を使用すると投げたコマンドが終了してしまうまで、後の処理が行われません。 バックグラウンド処理を行いたかったので、 String com = "ls -l &"; Process pro = Runtime.getRuntime().exec(com); としてみましたが、結果は変わりませんでした。 何か別の指定方法が存在するのでしょうか。 ご存知の方、ぜひ教えてください。

    • ベストアンサー
    • Java
  • シェルが実行されません

    WWWユーザから、 Process process = Runtime.getRuntime().exec("java -classpath /xx/xx/xx /export/home/test/B001"); は動くのですが、 Process process = Runtime.getRuntime().exec("java /export/home/test/B001.sh"); のようにシェルを呼び出しても動作しません。 また、hulftのジョブ起動からもシェルが動かないのですが、原因は何が考えられますでしょうか? シェルのパーミッションは755なのですが・・

  • Runtime.exec()について

    Runtime.exec()について質問させて下さい。 現在、Windowsのサーブレット上のファイル操作で ファイルの属性ごと(読み取り専用)コピーしたいので Runtime.exec()からxcopyコマンドを呼び出してコピーしています。 (JavaのAPIでは属性ごとコピー、属性変更ができない!?ため) エディタはeclipse3.5を使用しております。 eclipse上のTomcat6.0では綺麗にコピーしてくれるのですが、 Tomcat6.0のみでの実行ではコピーできません(0個のファイルをコピー) eclipse3.5上のTomcat設定とTomcat自体のJVM設定でのJREパスは同じJRE を参照しています。常にEclipseを起動させた状態!!ってのは厳しいので なんとかTomcatのみでコピーを成功させたいので助言お願いいたします。 下記ソースで 4個の読み取り属性を強制上書きコピーしますと、表示は Eclipse3.5上では → 「4個のファイルコピーに成功」表示 Tomcat6上では   → 「0個のファイルコピーに成功」表示 となります。。。 【以下ソース】 CopyFrom = "コピー元パス"; CopyTo  = "コピー先パス"; try{  String[] cmd = new String[]{"cmd","/c","xcopy",CopyFrom+"*.*",CopyTo,"/y","/r","/k","/h"};  Runtime Run = Runtime.getRuntime();  Process process = Run.exec(cmd);  //実行結果取得  InputStream is = process.getInputStream();  BufferedReader br = new BufferedReader(new InputStreamReader(is));  String Line = null;  while((Line = br.readLine()) != null){   System.out.println(Line);  } }catch(IOException e){  System.out.println(e); } 【環境】 ・Windows Server2003 ・Java1.6.0_13(パスは通しています) ・Tomcat6.0.14

    • ベストアンサー
    • Java
  • tomcatでのPDF出力について

    現在、tomcat 7.0+struts 2.2.3 + java 1.6 にてPDFの印刷を行うプログラムを作成しています。 AcrobatReaderをコマンドラインで呼び出して印刷したかったのですが、 eclipse上では正常に動作するのですが、いざtomcatにwarでアップロードし、実行すると エラーもはかれず処理が終了してしまいます。 下記が、処理されなかった部分です。 String cmd = "cmd /c START AcroRd32.exe /t " + "ファイル名"; System.out.println(cmd); ←ここの出力結果を「cmd /c 」を除いてコマンドプロンプトでたたくと正常に印刷されます。 Process p1 = Runtime.getRuntime().exec(cmd); p1.waitFor(); 原因がわかる方いらっしゃいましたらご教授お願い致します。

    • ベストアンサー
    • Java
  • 助けて下さい!Runtime Erroについて

    非常に困っています!IEを開くと、ほぼ同時にruntime erroが表示され これが一旦出てくるとIEを閉じざるを得ない状況にされます。何度IEを開いても、このエラーが出てきてしまうので事実上ほぼIEが使えない状況です。まず機種はDELLのINSPIRON4000 PP01L Windows2000です。 そしてIEを開くと始めにRuntime Library Runtime Erro! Program:c¥Program Files¥Internet Explorer¥IEXPLORE.EXE This application has requested the Runtime to terminate it in an unusual way. Please contact the application`s support team for more information. が出てきて、その次に IEXPLORE.EXEアプリケーションエラー "0x10094c3b"の命令が"0x01fcc3e8"のメモリを参照しました。メモリが'read"になることはできませんでした。プログラムを終了するにはOKをクリックして下さい。 で、OKをクリックするとIEが閉じてしまいます。 その後すぐに アプリケーションエラー エラーが発生したため、<プロセスは既にあります>を終了します。プログラムをもう1度開始する必要があります。エラーログを作成しています。 の後に ワトソン博士は、アプリケーションをプロセスにアタッチできませんでした。ワトソン博士がアタッチする前にプロセスが終了した可能性があります。 WINDOWS2000エラーコード=87 パラメータが間違っています。 と四つのエラーが次々と出てきます。色々、自分でIEをダウンロードし直したりと努力してみたんですが、もう お手上げです。非常に困っているので誰か、お力をお貸し下さい。 ウイルス対策はウイルスキラーを使っています。宜しくお願いします。