Bash 스크립트에서 Java 애플리케이션의 프로세스 ID 찾기(대상 애플리케이션이 이미 실행 중인지 확인)

Bash 스크립트에서 Java 애플리케이션의 프로세스 ID 찾기(대상 애플리케이션이 이미 실행 중인지 확인)

프로세스 ID를 얻는 방법에 관해 수많은 질문이 있다는 것을 알고 있지만 이 질문은 독특해 보입니다. Google에서 답변을 제공하지 않았으므로 이 질문을 종료하는 대신 stackexhange가 도움이 되기를 바랍니다.

Java가 관련되어 있으면 프로세스 ID를 찾는 것이 더 어려운 것 같습니다(pgrep이 작동하지 않음).

또한 bash 스크립트에서 이를 자동화해야 합니다. 내가 가진 한 가지 문제는 ps aux | grep프로세스 자체를 grep할 때 항상 발생한다는 것입니다. 따라서 간단한 bash 스크립트에서 결과를 처리하는 것은 (제한된 bash 기술을 사용하여) 좋은 솔루션을 스스로 알아낼 만큼 간단하지 않습니다.

내가 시도한 몇 가지:

예 1 - 동일한 이름을 가진 애플리케이션이 없는 경우에도 프로세스를 반환합니다.

$ ps aux | grep -i anythingnotreal
user2   3040  0.0  0.0   4640   856 pts/3    S+   18:17   0:00 grep --color=auto -i anythingnotreal

예 2 - "java_app"이 현재 실행 중인데도 아무것도 반환되지 않습니다.

$ pgrep java_app

아무것도 반환하지 않습니다. 그러나 "java_app"이 실행 중이라는 증거는 다음과 같습니다.

$ ps aux | grep java_app
tester2   2880  0.7  2.8 733196 58444 ?        Sl   18:02   0:07 java -jar /opt/java_app2/my_java_app.jar
tester2   3058  0.0  0.0   4644   844 pts/3    S+   18:19   0:00 grep --color=auto java_app

나에게 필요한 것은 관심 있는 Java 애플리케이션(내가 알고 있는 jar 파일 이름과 경로)이 현재 실행 중인지 알려주는 bash 스크립트에 연결할 수 있는 솔루션입니다. (실행 중인 경우 스크립트가 계속되기 전에 사용자에게 이를 닫도록 요구해야 합니다.)

답변1

기본적으로 pgrep인수는 일치하지 않고 명령만 일치합니다. 전체 명령줄을 일치시키려면 이 -f옵션이 필요합니다.

$ pgrep -f java_app

pgrep 맨페이지에서:

-f 이 패턴은 일반적으로 프로세스 이름과만 일치합니다. -f가 설정된 경우 전체 명령줄을 사용합니다.

답변2

pidof java실행 중인 Java 프로세스를 찾은 다음 각 프로세스의 세부 정보를 가져오는 데 사용할 수 있습니다 . 예를 들어 ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS대상 애플리케이션이 실행 중인지, 해당 애플리케이션을 사용하려면 사용자가 닫거나 계속해야 하는지 여부를 확인할 수 있습니다.

답변3

당신은 그것을 사용할 수 있습니다jcmdJDK의 일부인 유틸리티입니다. 현재 실행 중인 Java 프로세스만 나열하므로 grep만 수행하면 됩니다.java_app

jcmd | grep java_app | cut -d " " -f 1

관련 정보