如何在Windows中终止一个进程树

10

嗨,我有这个进程树:

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进程?


"getppid" 在 Win32 上未实现,这意味着仅仅通过遍历每个进程并检查给定 PID 是否为其父进程是行不通的 :( - DVK
在 http://www.perlmonks.org/ 上有一位熟练的 Perl/Windows 用户。 - ikegami
另外,如果您能找出如何在C中完成它(使用API或WMI),我可以帮助您将其移植到Perl。 - ikegami
Win32::Process::Info$pi->Subprocesses - J-16 SDiZ
3个回答

11
您可以使用Windows命令TASKKILL /T来终止一个进程及其子进程。
$pid = ...;
system("TASKKILL /F /T /PID $pid");

3

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"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接