10

嗨,我有这个进程树:

在此处输入图像描述

上面的屏幕截图显示了一个进程树。在我的 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 进程?

4

3 回答 3

10

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

$pid = ...;
system("TASKKILL /F /T /PID $pid");
于 2012-06-04T15:27:57.140 回答
3

可以使用PERL 中的 WMI。WMI 能够找到给定父进程的所有子进程的 PID。注意查询"select * from win32_process where ParentProcessId={0}"。如果您有子 PID 列表,则可以调用Win32::Process::KillProcess.

于 2012-06-04T15:27:29.740 回答
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"

于 2012-06-04T20:53:32.543 回答