シェルスクリプトの実行からJavaログ入力を読み込む[閉じる]

シェルスクリプトの実行からJavaログ入力を読み込む[閉じる]

Javaアプリケーションの起動に使用されるUnixシェルスクリプトがあります。私はJavaアプリケーションの起動時にいくつかの情報を記録しますが、他のJavaアプリケーションがシェルスクリプト自体を読み取ることができるように、私のスクリプトがそのログ情報を「読む」ことができるかどうか疑問に思います。

私はこれらのいくつかに慣れていないので、これは不可能になる可能性が高いですが、尋ねたいと思いました:)

ベストアンサー1

named pipes以下を使用して、Javaアプリケーションのログを名前付きパイプにリダイレクトできます。他のJavaアプリケーションでは、名前付きパイプからコンテンツを読み取る必要があります。

名前付きパイプ定義:

名前付きパイプとも呼ばれるFIFOは、パイプに似ていますが、ファイルシステムに名前を持つ特別なファイルです。複数のプロセスが通常のファイルのように、この特殊ファイルにアクセスして読み書きできます。

例は次のとおりです。

名前付きパイプを作成します。

mkfifo /home/user/pipe1

ログを表示するJavaアプリケーション

次のようなアプリケーションがあるとしましょう。

メインプログラム.java

public class Main {
   

   public static void main(String[] args) throws Exception {
      System.out.println("Hello From Java!");
      Thread.sleep(5000); //sleep 5 seconds
      System.out.println("Goodbye");
   }

}

他のJavaアプリケーションがログを読み取ります。メインプログラム.java

log.javaを読む

import java.io.*;

public class ReadLogs {
 
static BufferedReader pipeReader;

public static void createBuffer(String namedPipe) throws Exception {
    pipeReader = new BufferedReader(new FileReader(new File(namedPipe)));
} 

public static void process() throws Exception {
   String msg;
    while ((msg = pipeReader.readLine()) != null) {
          System.out.println("Message: "+msg);
    }
}

public static void main(String args[]) throws Exception {
       createBuffer("/home/user/pipe1");
       process();              
       System.out.println("EOF: Finished");
}
}

Javaアプリケーションのログを名前付きパイプにリダイレクトします。

java MainApplication > /home/user/pipe1

最後に、ReadLogs Javaアプリケーションを実行している名前付きパイプの内容を読む必要があります。

java ReadLogs

メモ:これメインプログラム.javapipe1アプリケーションは、その出力の内容を読み取った場合にのみ、各出力をこの出力にリダイレクトします。たとえば、プログラムを実行するとjava Main > /home/user/pipe1読み取りを待ちますpipe1

Javaを使用せずに次のコードを読むことができますpipe1

#In the terminal type:
java MainApplication > /home/user/pipe1
#In another terminal or tab:
cat /home/user/pipe1

おすすめ記事