【问题标题】:How to kill a process tree in Windows如何在 Windows 中杀死进程树
【发布时间】:2012-06-08 12:41:48
【问题描述】:

您好,我有这个进程树:

上面的截图显示了一个进程树。在我的 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 是否为其父进程的每个进程将不起作用:(
  • perlmonks.org 有一位知识渊博的 Perl/Windows 用户
  • 另外,如果你能找到如何在 C 中实现(使用 API 或 WMI),我可以帮助你将它移植到 Perl。
  • Win32::Process::Info$pi->Subprocesses

标签: perl winapi process kill


【解决方案1】:

可以使用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】:

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

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

    【讨论】:

      【解决方案3】:

      我还建议使用 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"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-17
        • 1970-01-01
        • 2012-06-13
        • 2015-11-02
        • 1970-01-01
        相关资源
        最近更新 更多