繁体   English   中英

如何从Java应用程序中准确获取Linux中正在运行的进程的列表?

[英]How do I get an accurate list of running processes in Linux from a Java application?

我正在开发一个应用程序,目前的要求之一是能够搜索其他正在运行的应用程序的进程,并在需要时将其杀死。

我尝试了JDK附带的“ jps ”,这正是我所需要的。 应用程序的进程ID,以及应用程序的真实名称。 使用此方法,我可以按进程ID终止进程,也可以按名称匹配实际上需要终止的进程,而不会终止错误的进程。 不幸的是,并非该应用程序的所有最终用户都将拥有JDK,因此jps不可靠。 我需要另一种方式来做到这一点。

我尝试了许多似乎无法正常运行的“ ps”命令。 例如目前我正在使用

ps -e -o command

这给了我...

line:  2729 ?        00:02:53 chrome
line:  2824 ?        00:00:00 cat
line:  2825 ?        00:00:00 cat
line:  2945 ?        00:00:00 chrome
line:  2946 ?        00:00:00 nacl_helper
line:  2959 ?        00:00:00 chrome
line:  2962 ?        00:00:00 gconfd-2
line:  3120 ?        00:07:39 chrome
line:  3179 ?        00:00:00 chrome
line:  3296 ?        00:00:44 chrome
line:  3500 ?        00:00:00 bash
line:  3751 ?        00:07:27 java
line:  3832 ?        00:00:00 file-roller
line:  4832 ?        00:00:23 chrome
line:  4883 ?        00:00:03 gnome-terminal-
line:  6085 ?        00:00:51 chrome
line:  6380 ?        00:00:06 chrome
line:  7865 ?        00:00:16 chrome
line:  8961 ?        00:00:06 chrome
line:  9404 ?        00:00:43 chrome
line: 10344 ?        00:00:02 chrome
line: 10761 ?        00:00:05 chrome
line: 11158 ?        00:00:00 java
line: 11193 ?        00:00:00 sh

这对我没有帮助,因为它没有显示进程名称,而且似乎也不准确。 当我从终端运行Java应用程序,然后重新运行该程序时,当我期望看到添加了一个额外的过程时,正在运行的应用程序不会改变。

我目前正在使用Java

/bin/sh -c ps -e -o command

有什么办法吗? 还是通过某种方式隔离jps可执行文件,以便我可以将其打包到项目中并在便携式庄园中使用?


当从JDK运行jps时 ,我得到此输出

3751 Main
14015 Jps
**11503** updater.jar

当我从机器终端运行ps -ef时,我得到此输出

root     10519     2  0 20:25 ?        00:00:00 [kworker/5:0]
root     11156     2  0 20:40 ?        00:00:00 [kworker/7:1]
root   **11503**  6170  0 20:49 pts/1    00:00:01 java -jar game/updater.jar /home
root   13031  2959  0 21:15 ?        00:00:13 /opt/google/chrome/chrome --type
root     13071     2  0 21:19 ?        00:00:00 [kworker/4:2]

当我从Java应用程序运行ps -ef时 ,得到以下信息,并且进程ID 11503无处可见...

Process process = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", "ps", "-ef" });

line:  7865 ?        00:00:17 chrome
line:  8961 ?        00:00:06 chrome
line:  9404 ?        00:00:43 chrome
line: 10344 ?        00:00:03 chrome
line: 13031 ?        00:00:09 chrome
line: 13098 ?        00:00:15 chrome
line: 13961 ?        00:00:00 java
line: 13996 ?        00:00:00 sh
line: 13997 ?        00:00:00 ps

问题是命令中的/ bin / sh -c。 尽管我仍然认为jps是更好的解决方案,但删除此选项可以为我提供正确的输出(可以将jps隔离,但最终大小为〜100mb)

这里有两个非常不同的事情:

  1. 什么/如何运行ps命令。 我个人的看法是: ps -ef列出所有具有“完整”格式的进程。 请参阅以获取更多信息。
  2. 如何调用和读取Java的输出。 为此,请参见此处的示例。

由于这似乎是Linux或类似操作系统,因此我想比捕获“ ps”的输出更好的方法是枚举/ proc中带有数字文件名的所有文件,并检查每个文件中的cmdline。 也就是说,所有各种/ proc / NNNN / cmdline文件。 这不需要运行ps或任何其他外部进程,它们的输出在系统之间可能会有所不同。 它提供对操作系统所有信息的访问-您不必完全依靠“ ps”来完成所需的操作。

而且,您不必依赖Runtime.exec()及其所有微妙之处。

尽管发布给该问题的答案似乎解决了一个问题,但最终并不能解决我的问题。

问题是我传递的命令

Process process = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", "ps", "-ef" });

/ bin / sh -c应该删除,并且它返回正确的进程。

Process process = Runtime.getRuntime().exec(new String[] { "ps", "-ef" });

我还致力于使用JDK附带的jcmd应用程序,因为它提供了我正在寻找的内容,并且得到了跨平台的支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM