如何在Linux上findJava或JRuby中的PID?

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

是否有另一种方法来获得PID?

针对操作系统特定的JRE进行编码

命令在Windows cmd中工作,但Runtime.getRuntime.exec()失败

JBoss在Windows上运行良好吗?

使用bash脚本/ grep / sed来replace文件名本身的类名

如何将java -jar错误输出到文本/日志文件?

如果你已经安装了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通道帮助我解决这个问题! (特别是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中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编写的,第二个是在shell提示符返回后由Java程序编写的。 ∎

产生一个将读取其父母的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调用的数组中的最后一个字符串。

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

它也有一个Windows的POSIX包装,它调用了libc的getpid()。 不需要JNI。

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...