我需要找到PID的当前运行中的进程上的一个Linux平台(它可以是一个系统依赖的解决方案)。Java不支持得到进程的ID,并继续目前有一个错误与红宝石的方法,处理。pid。

是否有另一种方式获得PID?

有帮助吗?

解决方案

如果您安装了 procfs ,则可以通过/ proc /找到进程ID self symlink,指向名称为pid的目录(此处还有文件包含其他相关信息,包括PID,但在这种情况下,您只需要该目录)。

因此,使用Java,您可以:

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

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

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

特别感谢免费节点上的#stackoverflow频道帮助我解决这个问题! (具体来说, Jerub gregh Topdeck

其他提示

仅在使用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

头文件包含函数的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程序编写的。 &#8718;

生成一个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 $`

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

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

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

Java 9 最后,提供一个正式的方式这样做 ProcessHandle:

ProcessHandle.current().pid();

这样的:

  • 第一个得到一个 ProcessHandle 参照当前的进程。

  • 为了对其访问 pid.

没有进口必要的,因为 ProcessHandle 是的一部分 java.lang.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top