在Windows中以编程方式终止Java进程

5
我有许多可执行的jar文件,我正在Windows服务器上运行它们。有时候,我需要重新部署一些应用程序。为此,我需要先停止现有进程,然后启动新进程。
在Linux环境中,我使用pkill根据jar文件名杀死进程。但是在Windows中,所有Java进程都只会被命名为“java.exe”。我需要编写一个批处理文件来执行这些启动和停止操作。
如何根据名称杀死jar文件呢?
假设我的jar文件命名为common-api.jar。运行命令jps -ml | find "common"将给出以下结果:

6968 common-api.jar

我可以通过taskkill /f /PID 6968 来结束进程。
但是,我该如何从第一个命令中提取进程ID并将其传递给taskkill命令呢?

如果你在结束服务时“杀死进程”,那么做法是错误的。使你的程序符合两个平台上通常的服务架构,然后你就可以使用正常的操作系统命令来停止和启动服务。 - jpmc26
你可以通过在WMI中使用Win32_Process列表的vbscript来完成它。 - Hackoo
3个回答

3
for /f "delims= " %%a in ('jps -ml ^| find /i "common"') do set PID=%%a
taskkill /f /PID %PID%

或者从命令提示符中:

for /f "delims= " %a in ('jps -ml ^| find /i "common"') do set PID=%a

它报错为“%%a 在此处是意外的。” - Yadu Krishnan
你是使用批处理文件还是从命令提示符中运行这个表单? - npocmaka

1

只需这样做:

for /f "tokens=1" %%A in ('jps -ml ^| find "common"') do (taskkill /F /PID %%A )

1
在VBScript中,我们可以像这样做,只需尝试一下即可:
Option Explicit
Call KillProcessbyName("common-api.jar")
'**********************************************************************************************
Sub KillProcessbyName(FileName)
    On Error Resume Next
    Dim WshShell,strComputer,objWMIService,colProcesses,objProcess
    Set WshShell = CreateObject("Wscript.Shell")
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process")
    For Each objProcess in colProcesses
        If InStr(objProcess.CommandLine,FileName) > 0 Then
            If Err <> 0 Then
                MsgBox Err.Description,VbCritical,Err.Description
            Else
                objProcess.Terminate(0) 
            End if
        End If
    Next
End Sub
'**********************************************************************************************

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接