【问题标题】:Java - get PID of external process by command line in Windows 7Java - 在 Windows 7 中通过命令行获取外部进程的 PID
【发布时间】:2012-07-25 23:46:29
【问题描述】:

我有带有 Java 的 32 位 Windows 7:

如何在 Windows 7 中通过命令行获取进程的 PID?

我想杀死一个我只能通过运行它的命令行才能真正识别的应用程序。我们在那台机器上运行了几个 Java 应用程序。我需要停止特定的。

确切地说:我需要找到由catalina.bat 运行的tomcat。您认为最好的方法是什么?

我知道任务列表,但它似乎无法查询启动该进程的命令行。查找java.exe 对我没有帮助。我尝试搜索一些有用的东西,比如 Windows 的 pgrep/pkill,但没有成功。

【问题讨论】:

    标签: java command-line pid


    【解决方案1】:

    您可以使用jps -lv 命令通过它的命令行选项来确定java 进程。 jps 是许多最新 JDK 中包含的实用程序。

    【讨论】:

    • 好主意。不知道jps。这将工作一段时间。尽管如此,如果有一个系统范围的解决方案,我仍然感兴趣。 (我已经接受不会有任何独立于系统的解决方案。)
    【解决方案2】:

    在命令提示符下尝试:

    sc queryex type= service state= all | find "APP"
    

    其中 APP 是程序的名称。此命令将返回所有匹配的服务。

    然后你可以运行SC QUERYEX APP,它会返回状态和PID号。

    一旦你有了 PID:

    TASKKILL /f /pid ###
    

    ### 是实际的 PID

    【讨论】:

      【解决方案3】:

      Java,获取Windows中当前运行进程的PID

      这应该适用于 LinuxOSXWindows 和 HotSpot JVM。

      import sun.management.VMManagement;
      import java.lang.management.ManagementFactory;
      import java.lang.management.RuntimeMXBean;
      import java.lang.reflect.Field;
      import java.lang.reflect.Method;
      
      public static int getCurrentPID() {
          try{
              java.lang.management.RuntimeMXBean runtime = 
                  java.lang.management.ManagementFactory.getRuntimeMXBean();
              java.lang.reflect.Field jvm = runtime.getClass().getDeclaredField("jvm");
              jvm.setAccessible(true);
              sun.management.VMManagement mgmt = 
                 (sun.management.VMManagement) jvm.get(runtime);
              java.lang.reflect.Method pid_method = 
                  mgmt.getClass().getDeclaredMethod("getProcessId");
              pid_method.setAccessible(true);
              return (Integer) pid_method.invoke(mgmt);
          }
          catch(Exception e){
              e.printStackTrace();
              System.out.println("Failed at getting the process ID");
              System.exit(0);
          }
      }
      

      像这样调用它:

      System.out.println("PID: " + getCurrentPID());
      

      对我来说,它会打印出 processID:PID: 5728

      来源:

      How can a Java program get its own process ID?

      http://boxysystems.com/index.php/java-tip-find-process-id-of-running-java-process/

      【讨论】:

        【解决方案4】:

        如果您只需要从 java 应用程序中杀死特定的 tomcat,为什么不编写一个在每个 tomcat 中运行的简单 servlet,该 servlet 将使用一个可以识别它的字符串来响应 get 请求。然后使用另一个 servlet 执行类似的操作:

        System.exit(-1);
        

        【讨论】:

        • 谢谢。好主意。在我在这里发布这个问题之后,我也想到了这一点,但从长远来看并没有解决我的问题。它现在应该可以工作,但将来我还需要关闭其他 Java 应用程序。
        【解决方案5】:

        终于找到东西了。为我工作的解决方案称为 wmic(Windows Management Instrumentation 命令行)。这个不错的工具内置于 Windows 7 Pro(我的)和可能的其他 Windows 版本中。它提供了种类繁多的操作,例如列出所有正在运行的任务以及您可以想象的每个细节(例如它们对应的命令行)、各种硬件信息等。正是我需要的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-10
          • 2017-04-06
          • 1970-01-01
          • 2012-10-28
          • 1970-01-01
          相关资源
          最近更新 更多