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 がわからないことです。Java プロセスである dscli の子 PID を取得する必要があります。上記のコードを使用して 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 に答える