如何在 Linux 上的 Java 或 JRuby 中找到我的 PID?
我需要在Linux平台上找到当前正在运行的进程的PID(它可以是系统相关的解决方案)。 Java 不支持获取进程 ID,而 JRuby 目前存在 Ruby 方法 Process.pid 的错误。
还有其他方法获取PID吗?
I need to find the PID of the current running process on a Linux platform (it can be a system dependent solution). Java does not support getting the process ID, and JRuby currently has a bug with the Ruby method, Process.pid.
Is there another way to obtain the PID?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
如果您安装了 procfs,您可以通过 /proc/self 符号链接找到进程 ID,它指向一个名为 pid 的目录(这里还有包含其他相关信息的文件,包括 PID,但在本例中您只需要该目录)。
因此,使用 Java,您可以执行以下操作:
在 JRuby 中,您可以使用相同的解决方案:
特别感谢免费节点上的 #stackoverflow 频道帮助我解决了这个问题! (具体来说,Jerub、gregh 和 Topdeck)
If you have procfs installed, you can find the process id via the /proc/self symlink, which points to a directory whose name is the pid (there are also files here with other pertinent information, including the PID, but the directory is all you need in this case).
Thus, with Java, you can do:
In JRuby, you can use the same solution:
Special thanks to the #stackoverflow channel on free node for helping me solve this! (specifically, Jerub, gregh, and Topdeck)
仅在使用 Sun JVM 的 Linux 中进行了测试。 可能不适用于其他 JMX 实现。
Only tested in Linux using Sun JVM. Might not work with other JMX implementations.
可以使用JNI接口调用POSIX函数 getpid()。 这非常简单。 您从所需的 POSIX 函数的类开始。 我将其称为
POSIX.java
:编译它
之后,生成一个头文件
POSIX.h
,该头文件包含该函数的 C 原型,并包装了 getpid 函数。 现在您必须实现该功能,这非常简单。 我是在 POSIX.c 中完成的:
现在您可以使用 gcc 来编译它:
您必须指定 Java 的安装位置。 就这样。 现在您可以使用它了。 创建一个简单的 getpid 程序:
使用
javac getpid.java
编译它并运行它:第一个 pid 由 shell 写入,第二个 pid 由 shell 提示符返回后的 Java 程序写入。 ∎
You can use the JNI interface to call the POSIX function getpid(). It is quite straight forward. You start with a class for the POSIX functions you need. I call it
POSIX.java
:Compile it with
After that you generate a header file
POSIX.h
withThe header file contains the C prototype for the function with wraps the getpid function. Now you have to implement the function, which is quite easy. I did it in
POSIX.c
:Now you can compile it using gcc:
You have to specify the location where your Java is installed. That's all. Now you can use it. Create a simple getpid program:
Compile it with
javac getpid.java
and run it:The first pid is written by the shell and the second is written by the Java program after shell prompt has returned. ∎
生成一个 shell 进程来读取其父进程的 pid。 那一定是我们的pid。 这是运行代码,没有异常和错误处理。
如果只是为了发出另一个 shell 命令而获取 PID,那么这个解决方案似乎是最好的。 将命令用反引号括起来就足够了,将其作为参数传递给另一个命令,例如:
这可能会替换给
exec
调用的数组中的最后一个字符串。Spawn a shell process that will read its parent's pid. That must be our pid. Here is the running code, without exception and error handling.
This solution seems to be the best if the PID is to be obtained only to issue another shell command. It's enough to wrap the command in back quotes to pass it as an argument to another command, for example:
This may substitue the last string in the array given to
exec
call.Java 9
最终通过 ProcessHandle:这:
首先获取当前进程的
ProcessHandle
引用。为了访问其
pid
。无需导入,因为
ProcessHandle
是java.lang
的一部分。Java 9
finally offers an official way to do so with ProcessHandle:This:
First gets a
ProcessHandle
reference for the current process.In order to access its
pid
.No import necessary as
ProcessHandle
is part ofjava.lang
.您可以尝试 JNR-Posix 中的 getpid() 。
它还有一个 Windows POSIX 包装器,可以调用 libc 的 getpid()。 不需要 JNI。
You can try getpid() in JNR-Posix.
It also has a Windows POSIX wrapper that calls getpid() off of libc. No JNI needed.