동일한 이름을 가진 Java 프로세스를 고유하게 식별합니다.

동일한 이름을 가진 Java 프로세스를 고유하게 식별합니다.

MyApp.jar예를 들어 동일한 파일 이름으로 실행되는 두 개의 Java 프로세스가 있습니다 .

/usr/java/latest/bin/java -jar MyApp.jar

이러한 항아리는 다른 위치에 존재하며 다른 구성을 사용합니다.

프로세스를 종료하고 싶지만 두 프로세스를 구별하는 방법을 모르겠습니다. 나는 다음을 실행한다:

 ps aux | grep [M]yApp.jar

그리고 얻다:

admin    21509  0.8  0.1 1199908 20484 ?       Sl   08:21   0:00 /usr/java/latest/bin/java -jar MyApp.jar
admin    21585  6.7  0.1 1199764 20084 ?       Sl   08:21   0:00 

나는 프로세스를 구별할 수 있도록 몇 가지 더미 매개변수를 사용하여 프로세스를 생성하는 것에 대해 생각했습니다.

/usr/java/latest/bin/java -jar MyApp.jar MyAppTheFirst

그리고

/usr/java/latest/bin/java -jar MyApp.jar MyAppTheSecond

그러나 이것은 나에게 약간 잘못된 것 같습니다. 더 좋은 방법이 있나요?

답변1

첫 번째,왜 그들 중 하나를 죽이겠습니까?프로세스가 너무 많은 리소스를 사용하는 경우 다음에서 PID를 얻을 수 있습니다 top.

top -n 1

주기적으로 또는 외부 자극에 반응하여 다시 시작해야 하는 경우공정 관리:

while true
do
    java -jar MyApp.jar &
    my_app_pid=$!
    while ! whatever_makes_me_think_my_app_should_be_restarted
    do
        sleep 60
    done
    kill $my_app_pid
done

답변2

매개변수를 변경하면 애플리케이션에 영향을 미치므로 최선의 방법은 아닙니다. 프로그램 이름 자체인 $0을 변경할 수 있습니다. 대부분의 프로그램은 이에 대해 신경 쓰지 않지만 일부는 이에 따라 동작을 변경합니다(예: mtools 및 busybox를 사용하여 IIRC와 같이 다른 이름으로 동일한 바이너리를 호출할 수 있는 경우).

bash -c 'exec -a mysleep sleep 100'
ps aux | grep sleep
hl       20818  0.0  0.0   5732   576 pts/10   S+   10:01   0:00 mysleep 100

또는 사용하는 환경:

bash -c 'IDSTRING=PROC1 exec sleep 100'
PID=20936
tr '\0' '\n' </proc/"$PID"/environ | grep IDSTRING
IDSTRING=PROC1

또는 PID와 추가 정보(프로세스 구별을 위해)를 로그 파일에 기록하는 래퍼 스크립트를 사용하여 프로세스를 시작합니다.

답변3

도움이 되는 유일한 방법은 더 높은 PID 번호를 결정하는 것입니다. PID 번호가 클수록 나중에 실행되는 프로세스입니다.하지만 항상 그런 것은 아니다

관련 정보