如何找到我的Java或JRuby的在Linux上的PID?(How do I find my PID

2019-07-04 21:25发布

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

有另一种方式来获得PID?

Answer 1:

如果你有procfs的安装,你可以找到通过在/ proc /自我符号链接的进程ID,它指向的目录中,其名称是PID(也有文件在这里与其他相关信息,包括PID,但该目录是所有你在这种情况下需要)。

因此,与Java,你可以这样做:

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

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

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

特别感谢#stackoverflow频道免费节点上帮我解决这个问题! (具体地, 耶路 , gregh和Topdeck )



Answer 2:

使用Sun JVM在Linux中只测试。 可能不会与其他JMX实现工作。

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


Answer 3:

您可以使用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写,二是由Java编写的程序返回shell提示符后。 ∎



Answer 4:

生成一个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);
  }
}

该解决方案似乎是最好的,如果PID是要获得只发出另一个shell命令。 这足以包装在反引号把它作为参数传递给另一个命令,例如下面的命令:

nice `ps h -o ppid $$`

这可能substitue给数组中的最后一个字符串exec调用。



Answer 5:

您可以尝试在GETPID() JNR-的Posix 。

它也有一个Windows POSIX包装调用GETPID()关闭的libc。 没有JNI需要。



Answer 6:

Java 9终于提供了一个正式的方式与这么做ProcessHandle :

ProcessHandle.current().pid();

这个:

  • 首先得到一个ProcessHandle当前进程的参考。

  • 为了访问其pid

必要时没有进口ProcessHandle是一部分java.lang



文章来源: How do I find my PID in Java or JRuby on Linux?