프로세스 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