13

我需要在 Linux 平台上找到当前正在运行的进程的 PID(它可以是系统相关的解决方案)。Java 不支持获取进程 ID,并且 JRuby 目前存在 Ruby 方法 Process.pid 的错误。

有没有其他方法可以获取 PID?

4

6 回答 6

25

如果你安装了procfs,你可以通过 /proc/self 符号链接找到进程 id,它指向一个名为 pid 的目录(这里也有包含其他相关信息的文件,包括 PID,但目录是所有在这种情况下你需要)。

因此,使用 Java,您可以:

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

在 JRuby 中,您可以使用相同的解决方案:

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

特别感谢免费节点上的#stackoverflow 频道帮助我解决了这个问题!(特别是JerubgreghTopdeck

于 2008-09-26T07:07:17.013 回答
7

仅在使用 Sun JVM 的 Linux 中进行了测试。可能不适用于其他 JMX 实现。

String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
于 2008-09-26T08:43:35.037 回答
2

可以使用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

头文件包含该函数的 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 程序编写。∎</p>

于 2012-07-09T14:19:29.913 回答
2

生成一个将读取其父进程 pid 的 shell 进程。那一定是我们的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 只是为了发出另一个 shell 命令,这个解决方案似乎是最好的。将命令包含在反引号中以将其作为参数传递给另一个命令就足够了,例如:

nice `ps h -o ppid $$`

这可能会替换给定exec调用的数组中的最后一个字符串。

于 2012-10-14T21:27:48.940 回答
1

Java 9最后通过ProcessHandle提供了一种官方方法:

ProcessHandle.current().pid();

这:

  • 首先获取ProcessHandle当前进程的参考。

  • 为了访问它的pid.

不需要导入,因为ProcessHandle它是java.lang.

于 2018-09-26T22:17:41.350 回答
0

您可以在JNR-Posix中尝试 getpid() 。

它还有一个 Windows POSIX 包装器,它从 libc 中调用 getpid()。不需要 JNI。

于 2015-03-11T17:02:30.163 回答