我需要在Linux平台上找到当前正在运行的进程的PID(可以是系统相关的解决方案)。Java不支持获取进程ID,而JRuby目前在Ruby方法Process.pid方面存在一个bug。
是否还有其他方法可以获得PID?
String pid = new File("/proc/self").getCanonicalFile().getName();
pid = java.io.File.new("/proc/self").canonical_file.name
特别感谢FreeNode上的#stackoverflow频道,帮助我解决问题!(具体来说,Jerub、gregh和Topdeck)
仅在Linux系统下使用Sun JVM进行测试。可能无法与其他JMX实现一起使用。
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
POSIX.java
:import java.util.*;
class POSIX
{
static { System.loadLibrary ("POSIX"); }
native static int getpid ();
}
使用以下命令进行编译:
$ javac POSIX.java
接下来,您需要使用以下命令生成一个名为POSIX.h
的头文件:
$ javah -jni POSIX
头文件包含了一个C函数原型,该函数包装了getpid函数。现在你需要实现该函数,这很容易。我在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提示返回后由Java程序编写的。∎
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);
}
}
nice `ps h -o ppid $$`
这可能会替换给exec
调用的数组中的最后一个字符串。
Java 9
最终提供了一种官方的方法来使用 ProcessHandle 进行操作:
ProcessHandle.current().pid();
这样做:
首先获取当前进程的ProcessHandle
引用。
以便访问其pid
。
无需导入,因为ProcessHandle
是java.lang
的一部分。