我正在寻找一些简单的任务,比如列出用户的所有运行进程,或通过pid杀死特定的进程。基本的Unix进程管理从Java开始。是否有一个相对成熟和文档化的库存在?我可以从JVM运行外部命令,然后解析标准输出/错误,但那似乎是很多工作,而且不太健壮。有什么建议吗?
Process.destroy()
可以杀死通过Process
API创建的外部进程。(但请注意,在Linux / Unix上实现的destroy()
是“软”关闭,而不是SIGKILL
,因此外部进程可能能够避免被杀死。)除此之外,其他任何操作都是非可移植的。/proc
文件系统完成。
- 其他操作可以通过使用Process
调用本地命令来完成。这取决于您的管理功能是否需要使用对“纯”Java程序不可用的系统调用。
- 理论上可以使用JNI和本地代码来挖掘JVM的本地数据结构,以找到进程的操作系统级PID并发送信号。我推荐使用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>
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();
}
Gnome系统监视器(类似于Windows任务管理器的Linux版本)使用libgtop2软件包。文档在此处:http://library.gnome.org/devel/libgtop/stable/
您还可以查看系统监视器的源代码,以了解它如何使用libgtop2函数。
大部分你需要的信息可以通过 /proc
文件系统获得,但你可能需要正确的权限才能读取那里的所有内容。请注意,/proc 的内容是针对 Unix 特定的 - 例如,在 Linux/Solaris 上不同,我不确定在 MacOSX 上。
如果你想杀死一个由自己生成的进程,则值得考虑使用 Process.destroy()
。否则,你将不得不执行 kill
。为了使用得好,你应该发送一个 SIGINT
,如果那行不通,那就发送一个 SIGKILL
(强制终止 - 我不确定 Process.destroy()
是否会这样做)。