Java 如何停止使用Eclipse外部工具配置启动的进程
我有一个启动java程序的WindowsJava 如何停止使用Eclipse外部工具配置启动的进程,java,eclipse,batch-file,Java,Eclipse,Batch File,我有一个启动java程序的Windows.bat文件。为了方便起见,我创建了一个直接从IDE启动它,并从Eclipse控制台读取它的标准输出 但是,当我使用Console视图中的terminate按钮(红色方块)从Eclipse终止进程时,程序仍在运行 如何从Eclipse中终止它(而不创建单独的启动配置来搜索它并以编程方式终止它)?您应该使用此命令 语法 TASKKILL[/S系统[/U用户名[/P[密码]]] {[/FI filter][/PID processid |/IM imagena
.bat
文件。为了方便起见,我创建了一个直接从IDE启动它,并从Eclipse控制台读取它的标准输出
但是,当我使用Console视图中的terminate按钮(红色方块)从Eclipse终止进程时,程序仍在运行
如何从Eclipse中终止它(而不创建单独的启动配置来搜索它并以编程方式终止它)?您应该使用此命令 语法 TASKKILL[/S系统[/U用户名[/P[密码]]] {[/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进程,其中“像“%java%”这样的名称”删除
到目前为止,我找到的最佳解决方法是一个可重用的外部应用程序启动器:
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
它还接受两个命令行参数:
java-jartest.jar
)Test.jar
),这样,当我从Eclipse控制台终止进程时,启动程序应用程序可以唯一地标识和终止目标进程当您运行一个外部工具时,它会在Eclipse上启动一个控制台 您只需在当前eclipse控制台右上角的工具栏上选择并停止该控制台即可
请编辑您的问题并发布启动此java程序的批处理文件的源代码@Hackoo我可以用一个简单的批处理文件来复制它,它的内容是:
java-jarmyapp.jar
,其中应用程序只显示一个空窗口(JFrame
)。在我从Eclipse控制台终止进程后,窗口仍然可见。我的实际应用程序有点复杂,但问题是相同的。那么你的应用程序创建的这个进程的名称是什么?我认为这里的问题是你只杀死.bat
进程,而不是它的子进程。这可能会对您有所帮助:.@DraganBozanovic如果您想杀死所有java.exe进程:taskkill/F/IM java.exe/T
或wmic进程,其中“名称如“%java%”删除Nice概述,谢谢。目前,我将使用一个单独的启动配置,该配置执行一个.bat
文件,其内容为:wmic进程,其中“命令行类似于命令行%%中的某个内容”删除,如您在注释中所建议的那样。我希望避免为停止服务创建单独的启动配置,但它仍然可以完成这项工作。