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

标签 java linux process

我正在制作一个应用程序,目前的一个要求是能够搜索其他正在运行的应用程序的进程,并在需要时终止它们。

我试过 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 - 以“完整”格式列出了所有进程。参见 this了解更多信息。
  2. 如何调用和读取 java 的输出。为此,请参阅 here例如。

关于java - 如何从 Java 应用程序获取 Linux 中正在运行的进程的准确列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45785657/

相关文章:

java - Mysql结果集错误

java - 将自定义 header 添加到 WebView 资源请求 - android

python - 更改文件创建日期

php - 哪个对数组处理得更好?

c - 2 线程在 Linux 中并行

java - 如何模拟 keystore 类并将模拟行为分配给其方法?

java - 是否应该实例化实用程序类?

linux - 为什么这个脚本不能与 nohup 一起使用但没有?

linux - mmap:使用多线程时的性能

multithreading - 调用 ls 或 rm 之类的二进制文件是不好的 Perl 做法吗?