如何用Java最好地管理Unix进程?

5

我正在寻找一些简单的任务,比如列出用户的所有运行进程,或通过pid杀死特定的进程。基本的Unix进程管理从Java开始。是否有一个相对成熟和文档化的库存在?我可以从JVM运行外部命令,然后解析标准输出/错误,但那似乎是很多工作,而且不太健壮。有什么建议吗?

6个回答

4
我认为你需要自己开发解决方案。使用Process.destroy()可以杀死通过Process API创建的外部进程。(但请注意,在Linux / Unix上实现的destroy()是“软”关闭,而不是SIGKILL,因此外部进程可能能够避免被杀死。)除此之外,其他任何操作都是非可移植的。
以下是一些可能的方法:
- 在Linux机器上列出进程可以通过读取/proc文件系统完成。 - 其他操作可以通过使用Process调用本地命令来完成。这取决于您的管理功能是否需要使用对“纯”Java程序不可用的系统调用。 - 理论上可以使用JNI和本地代码来挖掘JVM的本地数据结构,以找到进程的操作系统级PID并发送信号。
如果您选择使用JNI + 本地库路线,请注意本地指针问题和本地线程问题可能会导致JVM崩溃。您还可能需要处理为多个架构构建和分发本地库等问题。此外,请注意内部数据结构可能因JVM平台、版本等而异,并且它们可能会在不提前通知的情况下发生更改。

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>

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();
    }

1
你可以尝试使用JNA Posix。如果该库没有导出适当的函数,使用JNA为它们添加支持非常容易(我已经为许多Win32 API这样做了)。

0

Gnome系统监视器(类似于Windows任务管理器的Linux版本)使用libgtop2软件包。文档在此处:http://library.gnome.org/devel/libgtop/stable/

您还可以查看系统监视器的源代码,以了解它如何使用libgtop2函数。


如果你使用JNI从Java调用libgtop2函数,祝你JVM稳定运行,祝你好运 :-) - Stephen C

0

大部分你需要的信息可以通过 /proc 文件系统获得,但你可能需要正确的权限才能读取那里的所有内容。请注意,/proc 的内容是针对 Unix 特定的 - 例如,在 Linux/Solaris 上不同,我不确定在 MacOSX 上。

如果你想杀死一个由自己生成的进程,则值得考虑使用 Process.destroy()。否则,你将不得不执行 kill。为了使用得好,你应该发送一个 SIGINT,如果那行不通,那就发送一个 SIGKILL(强制终止 - 我不确定 Process.destroy() 是否会这样做)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接