2012-06-04 4 views
9

Привет У меня есть этот процесс дерево:Как убить дерево процессов в ОС Windows

enter image description here

выше скриншот показывает дерево процессов. В моем скрипте Perl я знаю PID dscli. Я написал следующий код, чтобы убить одного PID:

use Win32::Process; 
use strict; 
use warnings; 

if(defined($ARGV[0])){ 
    my $pid = "$ARGV[0]"; 
    my $exitcode = 0; 
    Win32::Process::KillProcess($pid, $exitcode); 
}else{ 
    print "No argument provided :(\n"; 
} 

Проблема заключается в том, что в моем сценарии я не знаю, процесс Java PID. Я должен получить дочерний PID пользователя dscli, который является java-процессом. Если я уничтожу PID dscli, используя вышеуказанный код, тогда ребенок (java) не умрет вместе с ним.

Так что мой вопрос: как я могу убить процесс java, который является дочерним элементом dscli, используя perl?

+0

'getppid' не реализована на Win32, что означает просто проходящие через каждый процесс проверки, если данный PID является его родитель не будет работать :( – DVK

+0

Там очень знающий Perl/Пользователь Windows по адресу http://www.perlmonks.org/ – ikegami

+0

Также, если вы можете узнать, как это сделать i n C (используя API или WMI), я могу помочь вам перенести его на Perl. – ikegami

ответ

7

Вы можете использовать команду Windows TASKKILL /T для завершения процесса и его дочерних процессов.

$pid = ...; 
system("TASKKILL /F /T /PID $pid"); 
0

Я также предлагаю использовать WMI, но вы можете просто вызвать VBScript со своего Perl. Вот скрипт, который я использую, чтобы убить по командной строке, которая может помочь вам сузить конкретный процесс Java на основе других вещей, которые были в командной строке, когда он был запущен:

If WScript.Arguments.Count = 1 Then 
strProcess = WScript.Arguments.Item(0) 
On Error Resume Next 
strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set objShell = CreateObject("WScript.Shell") 
Set colProcessList = objWMIService.ExecQuery _ 
    ("Select * from Win32_Process") 

If colProcessList.Count > 0 Then 
    For Each objItem in colProcessList 
     If InStr(objItem.CommandLine, strProcess) Then 
      If (InStr(objItem.CommandLine, "cscript")) Then 
      Else 
       WScript.StdOut.Write objItem.Name + " " 
       objItem.Terminate() 
      End If 
     End If 
    Next 
Else 
    WScript.StdOut.Write "No instances found running" 
End If 
Else 
WScript.StdOut.Write "Bad Arguments" 
End If 

Выполнить это так:

CScript whatEverYouNameIt.vbs «somethingInCommandLineLikeAClassName»

Смежные вопросы