Linux에서 Java 또는 Jruby에서 내 PID를 어떻게 찾습니까?
문제
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
.