我正在制作一个应用程序,目前的一个要求是能够搜索其他正在运行的应用程序的进程,并在需要时终止它们。
我试过 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)
最佳答案
这里有两个非常不同的东西:
关于java - 如何从 Java 应用程序获取 Linux 中正在运行的进程的准确列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45785657/