![](/img/trans.png)
[英]How to get a list of all running processes on Linux and Solaris with Java?
[英]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)
由于这似乎是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.