嗨,我有这个过程树:
上面的屏幕截图显示了一个进程树。在我的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进程?
答案 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”