我正在寻找一些简单的任务,例如列出用户的所有正在运行的进程,或者通过pid等来杀死特定进程。来自Java的基本unix进程管理。那里有一个相对成熟且有文件记录的图书馆吗?我可以从JVM运行一个外部命令,然后解析标准输出/错误,但这似乎很多工作,而且根本不健壮。有什么建议吗?
答案 0 :(得分:4)
我认为你需要推出自己的解决方案。使用Process
API杀死创建的外部流程可以使用Process.destroy()
完成。 (但请注意,在Linux / Unix上实现的destroy()
执行“软”删除,而不是SIGKILL
,因此外部进程可以避免被杀死。)
除此之外的任何东西都是不可携带的。
/proc
文件系统来完成列出进程(在Linux机器上)。Process
调用本机命令可以完成其他任务。这取决于您的管理功能是否需要使用“纯”Java程序无法使用的系统调用。如果您沿着JNI +本机库路线走,请注意本机指针问题和本机线程问题可能会导致您的JVM死机。您可能还需要处理为多种体系结构构建和分发本机库等。另外要注意,内部数据结构对于不同的JVM平台,版本等可能会有所不同,并且它们可能会更改,恕不另行通知。
答案 1 :(得分:2)
我建议JavaSysMon:您可以列出进程(pid,ppid,名称等),终止进程(包括子进程)和监视计算机。如果你想在Maven项目中使用它:
<dependency>
<groupId>javasysmon</groupId>
<artifactId>javasysmon</artifactId>
<version>0.3.3</version>
</dependency>
<repository>
<id>javasysmon-repo</id>
<url>http://openr66.free.fr/maven2/</url>
</repository>
答案 2 :(得分:1)
答案 3 :(得分:1)
这是一种从Java发送SIGKILL到进程的方法。它使用反射从Process子类获取pid值。在Mac OS X 1.6(Snow Leopard)和OpenSuse 11.4,java 1.6 64位HotSpot JVM上成功测试,但显然无法保证可移植性。
try {
Process p = Runtime.getRuntime().exec("sleep 10000");
Field pidField = p.getClass().getDeclaredField("pid");
pidField.setAccessible(true);
final int pid = pidField.getInt(p);
Process killProcess = Runtime.getRuntime().exec("kill -9 " + pid);
killProcess.waitFor();
System.out.println(p.exitValue());
} catch (Exception e) {
e.printStackTrace();
}
答案 4 :(得分:0)
Gnome系统监视器(Windows任务管理器的Linux版本)使用libgtop2包。 Documnetation:http://library.gnome.org/devel/libgtop/stable/
您还可以检查系统监视器的来源,以了解它如何使用libgtop2函数。
答案 5 :(得分:0)
您需要的大部分信息都可以通过/proc
文件系统获得,但您可能需要正确的权限才能阅读其中的所有内容。请注意,/ proc的内容是特定于Unix的 - 例如在Linux / Solaris上有所不同,我不知道重新。 MacOSX的。
如果您想要杀死自己产生的过程,那么Process.destroy()
值得关注。否则你将不得不执行kill
。为了很好地使用它,你应该发送一个SIGINT
,如果这不起作用,那么发送一个SIGKILL
(强制终止 - 我不确定Process.destroy()
是否这样做)< / p>