2015-01-29 2 views
5

У меня есть много исполняемых файлов jar, которые я запускаю на сервере Windows. Когда-нибудь мне нужно перераспределить некоторые из приложений. Для этого мне нужно сначала остановить существующий процесс, а затем запустить новый процесс. В среде linux я использую pkill, чтобы убить процесс, основанный на имени файла jar. Но в окнах все java-процессы будут называться только «java.exe». Мне нужно написать командный файл, чтобы выполнить эти операции запуска и остановки. Как я могу убить файл jar на основе имени.Убивать java-процесс в окнах программно

Предположим, что мой файл jar имеет имя common-api.jar. Выполнение команды jps -ml | find "common" даст результат как

6968 синфазного api.jar

Я могу убить процесс по taskkill /f /PID 6968

Но как я могу извлечь идентификатор процесса из первого команду и передать ее команде taskkill?

+0

Если вы «убиваете процессы», а не закрываете службы, вы делаете это неправильно. Сделайте свою программу совместимой с обычной архитектурой обслуживания на обеих платформах. Затем вы можете использовать обычные команды ОС для остановки и запуска служб. – jpmc26

+0

Вы можете сделать это с помощью vbscript с списком Win32_Process в WMI – Hackoo

ответ

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 
+0

Он дает ошибку, поскольку «%% a был неожиданным в это время». –

+0

Вы используете этот пакетный файл формы или из командной строки? – npocmaka

+0

@YaduKrishnan - проверьте мое обновление – npocmaka

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 
'********************************************************************************************** 
1

Просто сделать это:

for /f "tokens=1" %%A in ('jps -ml ^| find "common"') do (taskkill /F /PID %%A) 
Смежные вопросы