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