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