【问题标题】:What is the best way to manage unix process from java?从java管理unix进程的最佳方法是什么?
【发布时间】:2009-07-28 05:32:58
【问题描述】:

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

【问题讨论】:

    标签: java unix posix


    【解决方案1】:

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

    除此之外的任何东西都是不可移植的。

    • 可以通过读取/proc 文件系统来列出进程(在Linux 机器上)。
    • 可以通过使用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>
      

      【讨论】:

        【解决方案3】:

        你可以试试JNA Posix。如果该库没有导出相应的函数,则很容易使用JNA 添加对它们的支持(我已经为许多 Win32 API 这样做了)。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            您还可以查看 System Monitor 的来源,了解它如何使用 libgtop2 功能。

            【讨论】:

            • 如果您使用 JNI 从 Java 调用 libgtop2 函数,祝您的 JVM 稳定性好运 :-)
            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 2010-09-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-18
              • 2010-10-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多