문제

Linux 플랫폼에서 현재 실행중인 프로세스의 PID를 찾아야합니다 (시스템 종속 솔루션이 될 수 있음). Java는 프로세스 ID 받기를 지원하지 않으며 Jruby는 현재 Ruby Method, Process.pid가있는 버그를 가지고 있습니다.

PID를 얻는 또 다른 방법이 있습니까?

도움이 되었습니까?

해결책

당신이 가지고 있다면 Procfs 설치된 경우 /Proc /Self Symlink를 통해 프로세스 ID를 찾을 수 있습니다.이 디렉토리는 PID 인 디렉토리를 가리킬 수 있습니다 (여기에는 PID를 포함한 다른 관련 정보가 포함 된 파일도 있지만 디렉토리는 여기에 필요한 전부입니다. 사례).

따라서 Java를 사용하면 다음을 수행 할 수 있습니다.

String pid = new File("/proc/self").getCanonicalFile().getName();

Jruby에서는 동일한 솔루션을 사용할 수 있습니다.

pid = java.io.File.new("/proc/self").canonical_file.name

무료 노드의 #StackOverFlow 채널에 특별한 감사를드립니다. (구체적으로, 제럽, 그레, 그리고 상단)

다른 팁

Sun JVM을 사용하여 Linux에서만 테스트되었습니다. 다른 JMX 구현과 함께 작동하지 않을 수 있습니다.

String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];

JNI 인터페이스를 사용하여 POSIX 기능을 호출 할 수 있습니다. getpid(). 그것은 매우 간단합니다. 필요한 POSIX 기능 클래스부터 시작합니다. 나는 그것을 부른다 POSIX.java:

import java.util.*;

class POSIX
{
    static { System.loadLibrary ("POSIX"); }
    native static int getpid ();
}

그것으로 컴파일하십시오

$ javac POSIX.java

그 후 헤더 파일을 생성합니다 POSIX.h ~와 함께

$ javah -jni POSIX

헤더 파일에는 getpid 함수를 랩하는 함수의 C 프로토 타입이 포함되어 있습니다. 이제 기능을 구현해야합니다. 나는 그것을했다 POSIX.c:

#include "POSIX.h"

#include <sys/types.h>
#include <unistd.h>

JNIEXPORT jint JNICALL Java_POSIX_getpid (JNIEnv *env, jclass cls)
{
    return getpid ();
}

이제 GCC를 사용하여 컴파일 할 수 있습니다.

$ gcc -Wall -I/usr/lib/jvm/java-1.6.0-sun-1.6.0.21/include -I/usr/lib/jvm/java-1.6.0-sun-1.6.0.21/include/linux -o libPOSIX.so -shared -Wl,-soname,libPOSIX.so POSIX.c -static -lc

Java가 설치된 위치를 지정해야합니다. 그게 다야. 이제 사용할 수 있습니다. 간단한 getpid 프로그램 만들기 :

public class getpid
{
    public static void main (String argv[])
    {
        System.out.println (POSIX.getpid ());
    }
}

그것으로 컴파일하십시오 javac getpid.java 그리고 그것을 실행하십시오 :

$ java getpid &
[1] 21983
$ 21983

첫 번째 PID는 Shell에 의해 작성되었으며 두 번째 PID는 Shell Prompt가 반환 된 후 Java 프로그램에 의해 작성됩니다. ∎

부모의 PID를 읽을 쉘 프로세스를 생성하십시오. 그것은 우리의 PID 여야합니다. 예외 및 오류 처리없이 실행중인 코드는 다음과 같습니다.

import java.io.*;
import java.util.Scanner;

public class Pid2
{
  public static void main(String sArgs[])
    throws java.io.IOException, InterruptedException
  {
    Process p = Runtime.getRuntime().exec(
      new String[] { "sh", "-c", "ps h -o ppid $$" });
    p.waitFor();
    Scanner sc = new Scanner(p.getInputStream());
    System.out.println("My pid: " + sc.nextInt()); 
    Thread.sleep(5000);
  }
}

이 솔루션은 PID가 다른 쉘 명령을 발행하기 위해서만 얻어 져야한다면 가장 좋은 것으로 보입니다. 예를 들어 다른 명령에 인수로 인수로 전달하기 위해 명령을 뒤로 인용하여 명령을 래핑하는 것으로 충분합니다.

nice `ps h -o ppid $$`

이것은 주어진 배열의 마지막 문자열을 대체 할 수 있습니다. exec 전화.

getPid ()에서 시도 할 수 있습니다 jnr-posix.

또한 libc에서 getPid ()를 호출하는 Windows Posix 래퍼가 있습니다. JNI가 필요하지 않습니다.

Java 9 마지막으로 공식적인 방법을 제공합니다 프로세스 핸들:

ProcessHandle.current().pid();

이것:

  • 먼저 a ProcessHandle 현재 프로세스에 대한 참조.

  • 액세스하기 위해 pid.

수입이 필요하지 않습니다 ProcessHandle 의 일부입니다 java.lang.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top