【问题标题】:Getting JAVA PID PHP获取 JAVA PID PHP
【发布时间】:2014-01-31 15:19:19
【问题描述】:

我目前正在托管一个 java 服务器程序 (craftbukkit),似乎当我尝试从服务器程序 (craftbukkit) 获取 RAM 使用情况时,它不会返回实际使用的 RAM,而是大约一半它正在使用什么。 (虽然它并不总是正好是一半,所以不可能以这种方式估计实际的 RAM 使用量)。

我想知道如何获取 java 进程使用的实际 RAM,如系统监视器工具(在 linux 上)中所见,这样我就可以检索报告给系统。

我之前看到一个使用进程PID的例子,但是我不知道如何获取进程的PID,只知道名称。(只有一个java实例在运行,所以我们不不必担心得到错误的结果)

提前谢谢!

使用 ps -ef | grep "java" 我得到以下输出

prodynamics@prodynamics:~$ ps -ef | grep "java"
1000     22292 29385 75 12:08 pts/0    00:42:19 java -Xmx3100M -Xms1024M -XX:MaxPermSize=248m -jar craftbukkit.jar
1000     23544 23443  0 13:04 pts/2    00:00:00 grep java

但是使用 ps -eo pid | grep “java” 控制台根本不返回任何结果。虽然据我了解,它应该返回 PID。

【问题讨论】:

  • 可能是程序正在报告实际内存使用情况,但 java 分配/保留更多。我建议你看看如何查看你的操作系统(我假设是 Linux)正在使用多少内存并在 PHP 中执行一个解析它的命令。
  • 当我尝试从程序内部获取内存使用情况时,它返回比操作系统报告分配的更少,这不是我想要的值。我需要操作系统报告的值,我要问的是如何在没有 PID 的情况下通过 php 获取操作系统报告为已使用的值。我知道它正在报告实际内存使用情况,但我需要分配内存。这就是我要问的如何做。我知道我需要做什么,但不知道如何......
  • 如果你知道名字,谷歌“linux获取进程内存使用情况”并检查“grep”的作用......
  • 我只找到显示使用 PID 获取内存使用情况的结果,而不是进程名称。我的意思是,我到底为什么要先谷歌,这并不比向某人寻求帮助更快....*明显的讽刺应该是显而易见的*
  • 如前所述,如果你知道你的程序的名字,你可以得到PID:ps -ef | grep "my program"

标签: java php linux bash pid


【解决方案1】:

我能够通过以下方式成功获取 PID

ps -eo pid,comm | grep 'java$' | awk '{print $1}' | head -1

【讨论】:

    【解决方案2】:

    您无需在ps、管道、grep a.o 上浪费时间。你只需要pgrep:

    pgrep java
    

    请参阅man pgrep 了解更多信息。

    【讨论】:

      【解决方案3】:

      如果你真的需要,可以尝试以下方法:

      ps -ef | grep "java" | grep -v -i "grep" | cut -d ' ' -f 7
      

      这只会返回 java 进程的 PID,并且会排除您以这种方式进行的 grep 调用。最后可能需要对 7 进行一些调整,具体取决于您的系统。

      它的作用是从ps -ef 获取所有结果并过滤到仅包含java 但不包含grep 的结果。然后它在每个空格处切割结果,并返回字段 7(其中 7 是末尾的数字)

      【讨论】:

        【解决方案4】:

        您还可以使用 platform runtime MXBeangetName() 方法从 Java 应用程序中检索 PID:

        import java.lang.management.ManagementFactory;
        
        public class Pid {
          /**
           * Return the current process ID.
           * @return the pid as an int, or -1 if the pid could not be obtained.
           */
          public static int getPID() {
            int pid = -1;
            // we expect the name to be in '<pid>@hostname' format - this is JVM dependent
            String name = ManagementFactory.getRuntimeMXBean().getName();
            int idx = name.indexOf('@');
            if (idx >= 0) {
              String sub = name.substring(0, idx);
              try {
                pid = Integer.valueOf(sub);
                System.out.println("process name=" + name + ", pid=" + pid);
              } catch (Exception e) {
                System.out.println("could not parse '" + sub +"' into a valid integer pid :");
                e.printStackTrace();
              }
            }
            return pid;
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-23
          • 2021-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 2016-02-07
          • 2018-01-05
          相关资源
          最近更新 更多