繁体   English   中英

从java管理unix进程的最佳方法是什么?

[英]What is the best way to manage unix process from java?

我正在寻找一些简单的任务,比如列出用户的所有正在运行的进程,或者通过pid等来杀死特定的进程。来自Java的基本unix进程管理。 那里有一个相对成熟且有文件记录的图书馆吗? 我可以从JVM运行一个外部命令,然后解析标准输出/错误,但这似乎很多工作,而且根本不健壮。 有什么建议?

我想你需要推出自己的解决方案。 使用Process.destroy()可以完成使用Process API创建的外部进程的杀死。 (但请注意,在Linux / Unix上实现的destroy()执行“软”杀死,而不是SIGKILL ,因此外部进程可能能够避免被杀死。)

除此之外的任何东西都是不便携的。

  • 列表进程(在Linux机器上)可以通过读取/proc文件系统来完成。
  • 其他事情可以通过使用Process调用本机命令来完成。 这取决于您的管理功能是否需要使用“纯”Java程序无法使用的系统调用。
  • (理论上)可以使用JNI和本机代码在JVM的本机数据结构中挖掘,以找到进程的OS级PID并向其发送信号。

如果您沿着JNI +本机库路线走,请注意本机指针问题和本机线程问题可能会导致您的JVM死机。 您可能还需要处理为多种体系结构构建和分发本机库等。另外要注意,内部数据结构对于不同的JVM平台,版本等可能会有所不同,并且它们可能会更改,恕不另行通知。

我推荐JavaSysMon :您可以列出进程(pid,ppid,名称等),kill进程(包括子进程)和监视计算机。 如果要在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>

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

这是一个从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();
    }

Gnome系统监视器(Windows任务管理器的Linux版本)使用libgtop2包。 Documnetation: http//library.gnome.org/devel/libgtop/stable/

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

您需要的大部分信息都可以通过/proc文件系统获得,尽管您可能需要正确的权限来阅读那里的所有信息。 请注意,/ proc的内容是特定于Unix的 - 例如Linux / Solaris上的内容不同,我不知道。 MacOSX的。

如果你想杀死你自己产生的进程,那么Process.destroy()值得关注。 否则你将不得不执行kill 要很好地使用它,你应该发送一个SIGINT ,如果这不起作用,那么发送一个SIGKILL (强制终止 - 我不确定Process.destroy()是否这样做)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM