我怎么找到我的PID在Java或它在Linux上?
题
我需要找到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
.