我有一个启动java程序的Windows .bat
文件。为了方便起见,我创建了一个Eclipse external tools configuration来直接从IDE启动它,并从Eclipse控制台读取它的标准输出。
但是,当我在控制台视图中使用终止按钮(红色方块)从Eclipse终止进程时,程序仍在运行。
如何从Eclipse中删除它(没有创建一个单独的启动配置来搜索它并以编程方式终止它)?
答案 0 :(得分:4)
您应该使用此命令 TASKKILL
语法 TASKKILL [/ S system [/ U username [/ P [password]]]] {[/ FI filter] [/ PID processid | / IM imagename]} [/ F] [/ T]
选项 / S system要连接的远程系统。
/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.
过滤器应用以下过滤器之一:
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.exe
和javaw.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 /T
或wmic process where "name like '%java%'" delete
答案 1 :(得分:3)
到目前为止,我找到的最佳解决方法是可重复使用的外部应用程序启动器:
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外部工具配置对话框现在看起来像这样:
Location
对于所有配置始终相同,并指向仅运行启动器应用程序的start.bat
文件:
java -jar C:\ExternalProcessManager\ExternalProcessManager.jar %1 %2
它还需要两个命令行参数:
test.bat
,它只是启动我的测试应用程序:java -jar Test.jar
)。Test.jar
),以便当我从Eclipse控制台终止进程时,启动器应用程序可以唯一地标识并终止目标进程。答案 2 :(得分:0)
运行外部工具时,它将在Eclipse上启动控制台。
您只需在当前Eclipse控制台右上方的工具栏上选择并停止该控制台即可。