前提・実現したいこと
Javaから別のプログラムを子のプロセスとして実行した際に、子のプロセスの標準出力を捨てたい。
発生している問題・エラーメッセージ
Javaから別のJavaプログラムを子プロセスとして実行した際に、子プロセスがログ出力の途中で動かなくなります。
原因は、子プロセスとして実行しているプログラムで、(開発時のデバッグの目的で)ConsoleHandlerを使用してコンソールにログ出力をしているのですが、親側で子の出力内容を消費しないため、標準出力が途中で止められているためでした。
子の実行のタイミングを親側のプログラムで制御することが目的のため、子の標準出力内容は破棄し、子プロセスの処理完了を待たずに親側の処理を続けたいのですが、良い方法はありますか?
実行したコード(イメージ)
Oya.java
java
1public class Oya{ 2 public static void main(String[] args)throws Exception{ 3 4 ProcessBuilder pb = new ProcessBuilder("java", "Ko"); 5 Process prc = pb.start(); 6 7 //Oya独自の処理の代わり 8 Thread.sleep(30000); 9 } 10}
Ko.java
java
1import java.io.InputStream; 2import java.util.logging.Logger; 3import java.util.logging.LogManager; 4 5public class Ko{ 6 public static void main(String[] args)throws Exception{ 7 try(InputStream is = Ko.class.getResourceAsStream("ko-log.properties")){ 8 LogManager.getLogManager().readConfiguration(is); 9 } 10 Logger log = Logger.getLogger(Ko.class.getCanonicalName()); 11 12 for(int i=0;i<1000;++i){ 13 log.info("ログメッセージ"+ i); 14 } 15 } 16}
** ko-log.properties **
# Logging handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler .level = ALL # File Logging java.util.logging.FileHandler.pattern = myApp.log java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter java.util.logging.FileHandler.level = INFO # Console Logging java.util.logging.ConsoleHandler.level = ALL
私の環境では、Ko.javaは70回目付近のループ処理の後、親の処理が終了するまで処理が止まります。
ログの設定を変更し、コンソールへの出力しないようにした場合は停止はしませんが、開発時にコンソールのログを確認したいので、できれば設定を変更したくないです。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/10 07:19