从 shell 脚本执行中读取 Java 日志输入

从 shell 脚本执行中读取 Java 日志输入

我有一个 unix shell 脚本,在其中启动一个 Java 应用程序。该 Java 应用程序在启动时会记录一些信息,我想知道我的脚本是否可以“读取”该日志信息,以便另一个 Java 应用程序可以读取 shell 脚本本身?

我对其中一些是新手,所以很有可能这是不可能的,但我想我会问:)

答案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

读取日志.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.

您可以尝试以下代码来阅读pipe1而不使用java:

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

相关内容