如何在Windows中终止进程树

时间:2012-06-04 12:33:53

标签: perl winapi process kill

嗨,我有这个过程树:

enter image description here

上面的屏幕截图显示了一个进程树。在我的Perl脚本中,我知道dscli的PID。我编写了以下代码来杀死单个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。我必须得到dscli的子PID,这是java进程。如果我使用上面的代码杀死dscli的PID,那么子(java)不会死掉它。

所以我的问题是,如何使用perl杀死dscli的子进程java进程?

3 个答案:

答案 0 :(得分:7)

您可以使用Windows命令TASKKILL /T来终止进程及其子进程。

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

答案 1 :(得分:3)

可以使用WMI from PERL。 WMI能够find the PID of all child processes of a given parent。请注意查询"select * from win32_process where ParentProcessId={0}"。如果您有子PID列表,则可以调用Win32::Process::KillProcess

答案 2 :(得分:0)

我还建议使用WMI,但您可能只想从Perl调用VBScript。这是我用命令行杀死的脚本,它可以帮助您根据命令行启动时的其他内容缩小特定的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”

相关问题