쉘 스크립트 실행에서 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

관련 정보