2012-06-04 12 views
9

Witam mam do tego drzewa Proces:Jak zabić drzewo procesów w systemie Windows

enter image description here

Powyższy zrzut ekranu pokazuje drzewo procesów. W moim skrypcie Perla znam PID dscli. Napisałem poniższy kod, żeby zabić jednego 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"; 
} 

Problem polega na tym, że w moim scenariuszu nie wiem procesu Java PID. Muszę uzyskać PID potomka Dscli, który jest procesem java. Jeśli zabiję PID dscli za pomocą powyższego kodu, to dziecko (java) nie zginie razem z nim.

Moje pytanie brzmi: jak mogę zabić proces java, który jest dzieckiem dscli używającym perla?

+0

'getppid' nie jest realizowany na Win32, co oznacza po prostu w trakcie każdego procesu sprawdzania, czy dana PID jest jego rodzic nie działa :( – DVK

+0

jest kompetentny Perl/Użytkownik systemu Windows na http://www.perlmonks.org/ – ikegami

+0

Ponadto, jeśli możesz dowiedzieć się, jak to zrobić, n C (przy użyciu API lub WMI), mogę pomóc w przeniesieniu go do Perla. – ikegami

Odpowiedz

7

Możesz użyć polecenia Windows TASKKILL /T, aby zakończyć proces i jego procesy potomne.

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

Proponuję również użyć WMI, ale możesz po prostu wywołać skrypt VBScript ze swojego Perla. Oto skrypt, który używam do zabicia przez linię poleceń, które mogą pomóc w zawężeniu specyficzny proces java w oparciu o inne rzeczy, które znajdowały się w linii poleceń, kiedy została ona rozpoczęta:

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 

uruchomić go tak:

CScript whatEverYouNameIt.vbs „somethingInCommandLineLikeAClassName”

Powiązane problemy