2012-06-04 28 views
9

हाय मैं इस प्रक्रिया को पेड़ है को मारने के लिए कैसे:Windows में एक प्रक्रिया पेड़

enter image description here

ऊपर दिए गए स्क्रीनशॉट एक प्रक्रिया पेड़ को दर्शाता है। मेरी पर्ल स्क्रिप्ट में मुझे डीएससीआईआई के पीआईडी ​​पता है।

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"; 
} 

समस्या मेरी स्क्रिप्ट में मैं जावा प्रक्रिया 'पीआईडी ​​पता नहीं है कि यह है: मैं एक एकल पीआईडी ​​को मारने के लिए निम्नलिखित कोड लिखा है। मुझे डीएससीआई के बच्चे पीआईडी ​​को प्राप्त करना है जो जावा प्रक्रिया है। अगर मैं उपरोक्त कोड का उपयोग कर डीएससीआईआई पीआईडी ​​को मारता हूं तो बच्चा (जावा) इसके साथ मर नहीं जाता है।

तो मेरा सवाल यह है कि, मैं जावा प्रक्रिया को कैसे मार सकता हूं जो डीएसक्ली का बच्चा पर्ल का उपयोग कर रहा है?

+0

'getppid' Win32, बस एक जानकार पर्ल नहीं है यदि किसी विशेष पीआईडी ​​अपनी मूल काम नहीं करेगा :( – DVK

+0

है प्रत्येक प्रक्रिया की जाँच के माध्यम से जा रहा है जिसका अर्थ है पर लागू नहीं है/Http://www.perlmonks.org/ – ikegami

+0

पर विंडोज उपयोगकर्ता भी, यदि आप यह पता लगा सकते हैं कि यह कैसे करें I एन सी (एपीआई या डब्लूएमआई का उपयोग करके), मैं इसे पर्ल पर पोर्ट करने में आपकी सहायता कर सकता हूं। – ikegami

उत्तर

3

WMI from PERL का उपयोग करना संभव है। डब्ल्यूएमआई find the PID of all child processes of a given parent करने में सक्षम है। क्वेरी "select * from win32_process where ParentProcessId={0}" पर ध्यान दें। यदि आपके पास बच्चे पीआईडी ​​की सूची है, तो आप Win32::Process::KillProcess पर कॉल कर सकते हैं।

7

आप एक प्रक्रिया और उसके बच्चे की प्रक्रिया को समाप्त करने के लिए विंडोज कमांड TASKKILL /T का उपयोग कर सकते हैं।

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

मैं डब्लूएमआई का उपयोग करने का सुझाव भी दूंगा, लेकिन आप अपने पर्ल से केवल वीबीस्क्रिप्ट को कॉल करना चाहेंगे।

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"