0

我正在使用一段代码来获取基于 Windows 的系统上的任务管理器的进程,以便我可以发现我的基于桌面的应用程序的实例是否正在运行。代码工作正常,这是我的代码。

private static void getAppInstancesCountAlreadyRunning() throws Exception {

    int isApplicationRunning = 0;
    String line;
    Process p = Runtime.getRuntime().exec(
    System.getenv("windir") + "/system32/" + "tasklist.exe");

    BufferedReader input = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
    while ((line = input.readLine()) != null) {
        line = line.toLowerCase();
        logger.info("....... line read ... "+line);         
        if (line.contains("AppNameHere")) {// || line.contains("javaw.exe")
            logger.info("....... Already running @ " + line);
            isApplicationRunning++;
        }
    }
    input.close();

    if (isApplicationRunning > 1) {
        //Some code here....
    }
}

问题是: 我尝试了许多具有 Windows XP 和 7 的不同系统,但在一个系统上我没有得到进程列表,我认为行

Process p = Runtime.getRuntime().exec(System.getenv("windir") + "/system32/" +
 "tasklist.exe");

没有给出正确的列表,有人能说出原因是什么。

提前致谢。

4

3 回答 3

1

不确定原因(可能是 32/64 位版本问题、执行用户的权限、安全性等),但我想说有更好的方法来实现这一点。您当前的方法将与大多数 java 应用程序相匹配,其中许多应用程序使用 javaw.exe 运行。

相反,为什么不考虑在启动应用程序时将文件写入磁盘,以便其他调用可以检查这一点。当涉及在多个操作系统中运行时,这种方法也更加友好。

于 2013-06-18T07:34:00.340 回答
1

您不需要运行此过程的完整路径,只需执行Process p = Runtime.getRuntime().exec("tasklist");

此外,您还需要考虑可能未安装任务列表。

于 2013-06-18T07:30:46.467 回答
0

System.getenv(String path),尝试获取 path 的值,其中 path 是一个环境变量。如果在 env 变量中未定义 windir,则 System.getenv(String path) 将无法返回任何内容。

于 2013-06-18T07:29:16.160 回答