如何使用Eclipse外部工具配置启动进程

我有一个启动java程序的Windows .bat文件。 为了方便起见,我创建了一个Eclipse外部工具配置,以便直接从IDE启动它,并从Eclipse控制台读取其标准输出。

但是,当我在Console视图中使用terminate按钮(红色方块)从Eclipse终止进程时,程序仍在运行。

如何从Eclipse中删除它(没有创建一个单独的启动配置来搜索它并以编程方式杀死它)?

您应该使用此命令TASKKILL

语法TASKKILL [/ S system [/ U username [/ P [password]]]] {[/ FI filter] [/ PID processid | / IM imagename]} [/ F] [/ T]

选项/ S系统要连接的远程系统。

 /U [domain\]user The user context under which the command should execute. /P [password] The password. Prompts for input if omitted. /F Forcefully terminate the process(es). /FI filter Display a set of tasks that match a given criteria specified by the filter. /PID process id The PID of the process to be terminated. /IM image name The image name of the process to be terminated. Wildcard '*' can be used to specify all image names. /T Tree kill: terminates the specified process and any child processes which were started by it. 

filter应用以下filter之一:

  Imagename eq, ne String PID eq, ne, gt, lt, ge, le Positive integer. Session eq, ne, gt, lt, ge, le Any valid session number. Status eq, ne RUNNING | NOT RESPONDING CPUTime eq, ne, gt, lt, ge, le Time hh:mm:ss MemUsage eq, ne, gt, lt, ge, le Any valid integer. Username eq, ne User name ([Domain\]User). Services eq, ne String The service name Windowtitle eq, ne String Modules eq, ne String The DLL name 

例子:

 TASKKILL /S system /F /IM notepad.exe /T TASKKILL /PID 1230 /PID 1241 /PID 1253 /T TASKKILL /F /IM notepad.exe /IM mspaint.exe TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*" TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe TASKKILL /S system /U domain\username /FI "USERNAME ne NT*" /IM * TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*" 

这是一个名为的例子: ProcessKiller.bat

要立即杀死eclipse.exejavaw.exe类的不同进程,并将结果记录到日志文件中以获得成功或失败!

 @echo off cls & color 0A Mode con cols=50 lines=6 Title ProcessKiller by Hackoo 2016 set process="eclipse.exe" "javaw.exe" set Tmp=Tmp.txt set LogFile=ProcessKillerLog.txt If Exist %Tmp% Del %Tmp% If Exist %LogFile% Del %LogFile% For %%a in (%process%) Do Call :KillMyProcess %%a %Tmp% Cmd /U /C Type %Tmp% > %LogFile% If Exist %Tmp% Del %Tmp% Start "" %LogFile% Exit /b :KillMyProcess Cls echo. ECHO ************************************** Echo Trying to kill "%~1" ECHO ************************************** ( Echo The Process : "%~1" Taskkill /IM "%~1" /F /T Echo ======================= )>>%2 2>&1 

如果要杀死所有java.exe进程: Taskkill /F /IM java.exe /Twmic process where "name like '%java%'" delete

到目前为止,我发现的最佳解决方法是可重用的外部应用程序启动器:

 import java.lang.ProcessBuilder.Redirect; public class Main { public static void main(String[] args) throws Exception { Process process = new ProcessBuilder(args[0]) .redirectOutput(Redirect.INHERIT) .redirectError(Redirect.INHERIT) .start(); Thread thread = new Thread(() -> readInput(args[1])); thread.setDaemon(true); thread.start(); process.waitFor(); } private static void readInput(String commandLinePart) { try { while (System.in.read() != -1); killProcess(commandLinePart); } catch (Exception e) { e.printStackTrace(); } } private static void killProcess(String commandLinePart) throws Exception { final String space = " "; String[] commandLine = "wmic process where \"commandLine like '%placeholder%'\" delete" .replaceAll("placeholder", commandLinePart).split(space); new ProcessBuilder(commandLine).start(); } } 

我们的想法是启动此应用程序而不是外部应用程序,并将有关目标应用程序的信息作为命令行参数传递给它。

启动器应用程序然后启动该过程,重定向输出和错误流(以便我在Eclipse控制台中看到目标应用程序输出),等待直到目标进程完成并等待标准输入的EOF。

最后一点实际上是这样做的:当我从Eclipse控制台终止进程时,标准输入达到EOF,并且启动器应用程序知道是时候停止目标进程了。

Eclipse External Tools Configuration对话框现在看起来像这样:

在此处输入图像描述

所有配置的Location始终相同,并指向仅运行启动器应用程序的start.bat文件:

java -jar C:\ExternalProcessManager\ExternalProcessManager.jar %1 %2

它还需要两个命令行参数:

  1. 目标进程(在我的例子中, test.bat只是启动我的测试应用程序: java -jar Test.jar )。
  2. 命令行的一部分用于启动应用程序(在我的例子中是Test.jar ),这样当我从Eclipse控制台终止进程时,启动器应用程序可以唯一地识别并终止目标进程。