0

我现在正在做这件事;

                public class ProcessKill {
                private static final String TASKLIST = "tasklist";
                private static final String KILL = "taskkill /IM ";

                public static boolean isProcessRunging(String serviceName) throws Exception {
                 Process p = Runtime.getRuntime().exec(TASKLIST);
                 BufferedReader reader = new BufferedReader(new InputStreamReader(
                 p.getInputStream()));

                 String line;

                 while ((line = reader.readLine()) != null){
                     System.out.println(line);

                     if (line.contains(serviceName)){
                         return true;
                     }
                 }

                 return false;

                }

                public static void killProcess(String serviceName) throws Exception {

                  Runtime.getRuntime().exec(KILL + serviceName);

                 }  


            }

public static void main(String args[]) throws Exception{
    ProcessKill pkill = new ProcessKill();
    String processName = "wmplayer.exe";

    if (pkill.isProcessRunging(processName)){
        pkill.killProcess(processName);
    }

}

唯一的问题是,如果改名怎么办?我不想继续更新代码。有没有办法获取 .exe 文件的十六进制值并将其读入 Java 以检测它?

谢谢

4

2 回答 2

0

据我了解,您不想保留硬编码的进程名称。在这种情况下,只需通过命令行参数传递它:

public static void main(String args[]) throws Exception{
    ProcessKill pkill = new ProcessKill();
    String processName = args[0];

    if (pkill.isProcessRunging(processName)){
        pkill.killProcess(processName);
    }

}

现在您的用户必须提供要在命令行中终止的进程名称:

:> ProcessKill notepad.exe

但是恕我直言,我不明白你为什么需要你的实用程序?事实上你只是运行processkill,所以用户可以直接使用它。您的实用程序不提供任何附加功能。

于 2013-10-27T10:27:43.373 回答
0

好吧,您可以首先通过执行来检查您要杀死的进程是否正在运行wmic.exe PROCESS where name='"+processName+"'- 尽管 WMIC 提供了 PROCESS DELETE 选项,但 java-process 在调用此选项时会阻塞。wmic PROCESS(没有任何指定进程名称)返回 Windows 机器上所有当前正在运行的进程的列表(和描述),您可以使用 an 读取InputSreamReader()这些进程,然后遍历所有正在运行的进程并检查其中哪些可能是您的目标进程。此外,目标进程的行包含传递给进程的参数,您可以使用这些参数来区分进程,以防您有多个进程正在运行,或者需要删除应用程序使用的一些资源文件。

在调试我们使用嵌入式 mongodb 进行单元测试的应用程序时,在调试嵌入式 mongod 进程后继续运行并拒绝在下一个单元测试上工作(因为单元测试清理没有正确执行) - 此外它创建了一个本地无法被新的嵌入式 mongod 进程覆盖的数据存储区 - 因此需要手动删除它。因此,我从 WMIC 返回的行中提取了文件,并在自动终止进程后删除了这些文件。

于 2013-10-27T10:26:17.160 回答