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