我有一个 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