如何在Linux上的Java或JRuby中找到我的PID?

如何在Linux上的Java或JRuby中找到我的PID?,java,linux,jruby,pid,Java,Linux,Jruby,Pid,我需要在Linux平台上找到当前正在运行的进程的PID(它可以是依赖于系统的解决方案)。Java不支持获取进程ID,JRuby目前在Ruby方法process.pid中有一个bug 是否有其他方法获取PID?如果已安装,则可以通过/proc/self符号链接找到进程id,该链接指向一个名为PID的目录(此处还有包含其他相关信息的文件,包括PID,但在本例中,该目录是您所需的全部) 因此,使用Java,您可以: String pid = new File("/proc/self").getCano

我需要在Linux平台上找到当前正在运行的进程的PID(它可以是依赖于系统的解决方案)。Java不支持获取进程ID,JRuby目前在Ruby方法process.pid中有一个bug

是否有其他方法获取PID?

如果已安装,则可以通过/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通道帮助我解决了这个问题!(特别是、、和)

仅在使用Sun JVM的Linux中测试。可能无法与其他JMX实现一起使用

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

您可以使用JNI接口调用POSIX函数()。这很直截了当。您可以从一个用于所需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 ();
}
您必须指定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程序编写。∎

生成一个shell进程,该进程将读取其父进程的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);
  }
}
如果只需发出另一个shell命令即可获得PID,则此解决方案似乎是最好的。将命令用反引号括起来,将其作为参数传递给另一个命令就足够了,例如:

nice `ps h -o ppid $$`
这可能会取代数组中指定给
exec
调用的最后一个字符串。

您可以在中尝试getpid()


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

Java9
最终提供了一种官方的方法来实现这一点:

这:

  • 首先获取当前进程的
    ProcessHandle
    引用

  • 以访问其
    pid


无需导入,因为
ProcessHandle
java.lang

Process.pid的一部分,至少从jruby 1.7.23开始不再损坏
nice `ps h -o ppid $$`
ProcessHandle.current().pid();